我在多个进程之间有一个共享内存,以某种方式插入内存.例如:
DataBlock {
int counter;
double value1;
double ... }
Run Code Online (Sandbox Code Playgroud)
我想要的是计数器以原子方式更新/递增.并且在该地址上发生内存释放.例如,如果我不使用共享内存,那就像是
std::atomic<int> counter;
atomic_store(counter, newvalue, std::memory_order_release); // perform release operation on the affected memory location making the write visible to other threads
Run Code Online (Sandbox Code Playgroud)
如何为随机存储器位置(解释为DataBlock计数器>上面)实现此目的.我可以保证地址符合架构的要求(x86 linux)
- 使更新成为原子 - 如何?(即atomicupdate(addr,newvalue))
- 多核的内存同步 - (即memorysync(addr)) - 我唯一能看到的方法是使用std :: atomic_thread_fence(std :: memory_order_release) - 但这将"建立所有原子和放松原子存储的内存同步排序" - 那就是对我来说太过分了 - 我只想让计数器位置同步.欣赏任何想法.
我有一个模板类,它继承自接口类,因此具有虚函数
//abstract.h
class Abstract {
virtual void abc();
Abstract();
}
//Abstract.cpp
Abstract::Abstract()
{ //do some init}
//concrete.h
class Impl {
public:
void abcImpl();
};
template<typename T>
class Concrete : public Abstract, public T {
virtual void abc();
};
template<typename T>
Concrete<t>::abc() { static_cast<T>(*this).abcImpl(); }
//concrete.cpp
void Impl::abc() { std::cout << "abc"; }
Run Code Online (Sandbox Code Playgroud)
在这里使用
//foo.cpp
Concrete<Impl> *var1 = new Concrete<Impl>();
Run Code Online (Sandbox Code Playgroud)
在链接时,我得到一个错误未定义的引用`vtable for Abstract'
在过去,此错误表明编译器无法找到放置vtable的位置,因为没有与该类关联的cpp文件.换句话说,它将vtable放在首先找到任何成员函数的第一个非虚拟定义的位置.但这令人费解,因为.1.我不知道为什么它抱怨抽象 - 抽象实际上有一个cpp 2.也许错误消息实际上意味着具体?但是Concrete不能在cpp文件中因为它的模板化.那么在处理同样具有虚函数的模板类时,一般如何解决这个问题呢?
我有一个客户端connect()到服务器,当空闲时,它会在几个小时后超时.我在1秒内添加了setsockopt(套接字,SOL_SOCKET,SO_KEEPALIVE ...),但它并没有什么区别.为什么keepalive不起作用的任何线索?如果我使用SOL_TCP而不是SOL_SOCKET会有所不同吗?这是在Linux上.
在C++ 0x中的一个原子变量文档中,当描述内存顺序时,它提到:
发布 - 获取订购
在强排序系统(x86,SPARC,IBM大型机)上,发布 - 获取顺序是自动的.没有为此同步模式发出额外的CPU指令,只会影响某些编译器优化...
首先是真的,x86遵循严格的内存排序?似乎效率非常低,总是强加于此.意味着每次写入和读取都有围栏?
另外,如果我在x86系统上有一个对齐的int,原子变量是否可以用于任何目的?
C++不支持模板化的虚拟成员函数,但我有一个理想的场景.我想知道是否有人有想法如何实现这一目标.
#include <iostream>
class Foo {
public:
virtual void bar(int ){}
// make a clone of my existing data, but with a different policy
virtual Foo* cloneforDB() = 0;
};
struct DiskStorage {
static void store(int x) { std::cout << "DiskStorage:" << x << "\n"; }
};
struct DBStorage {
static void store(int x) { std::cout << "DBStorage:" << x << "\n"; }
};
template<typename Storage>
class FooImpl : public Foo {
public:
FooImpl():m_value(0) {}
template<typename DiffStorage>
FooImpl(const FooImpl<DiffStorage>& copyfrom) …
Run Code Online (Sandbox Code Playgroud) 在C++ 11中:如果我增加一个原子变量(std :: atomic上的operator ++),新值是否与内存屏障一起存储?或者我必须明确地做商店?
我理解新的Linux内核允许内核空间线程被抢先一步.有人可以简要解释在内核模式下执行时抢占是如何工作的吗?因此,当进行系统调用时,软件中断会将线程切换到内核模式,并且它将运行必要的内容.现在,让我们说它的时间片是 - 并且另一个用户线程运行,它也想在内核空间中执行.(或者它可能是啊/ w中断).当内核中断时,内核如何维护它为T1修改的任何结构的完整性?
为什么派生类在被模板化时不被允许访问其受保护的基类成员?
class MyBase {
protected:
int foo;
};
template<typename Impl>
class Derived : public Impl {
public:
int getfoo() {
return static_cast<Impl*>(this)->foo;
}
};
Run Code Online (Sandbox Code Playgroud)
编译器抱怨foo受到保护.为什么?
error: int MyBase::foo is protected
Run Code Online (Sandbox Code Playgroud) 什么是在C++中执行指针运算最干净的方法?我正在尝试将n
字节添加到地址.
int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))
Run Code Online (Sandbox Code Playgroud)
之后你可以重铸并以不同的方式使用foo
char* somestr = reinterpret_cast<char*>(foo)
Run Code Online (Sandbox Code Playgroud)
这够好吗?现在我理解指针实现dosent保证所有指针(char*
,int*
)都实现相同的大小.所以不确定是否int*
(应该是foo*
)并且使用unsigned int进行数学运算是最干净的解决方案.此外,它必须兼容32位和64位.
没关系为什么我这样做.虽然不是那么不寻常.当您使用动态解释为不同类型的数据流(或字节池)时,您将遇到此问题.
我对java很新,对这种行为有点困惑
public class MyBase<T> {
static int id;
}
public class DerA extends MyBase<DerA> {
}
public class DerB extends MyBase<DerB> {
}
Run Code Online (Sandbox Code Playgroud)
我期望DerA.id
并Derid
成为两个不同的static
变量.但似乎是在分享同一个!这种行为对我来说毫无意义 - 它有两种不同的类型.