有可能做这样的事情吗?
...
class test{
int i;
public:
test(int k):i(k){};
void my(){
cout<<i;
}
}
atomic<test> kk(0);
kk.test();
...
如果这是不可能的,那么如何调用函数以使其成为原子的?
有可能做这样的事情吗?
...
class test{
int i;
public:
test(int k):i(k){};
void my(){
cout<<i;
}
}
atomic<test> kk(0);
kk.test();
...
如果这是不可能的,那么如何调用函数以使其成为原子的?
工作方式std::atomic
是它使用处理器提供的某些指令。这些指令仅适用于特定大小的整数(不同的处理器对你能做什么和不能做什么有不同的限制和规则,在某些架构中,处理器架构甚至可能需要使用互斥锁或类似的功能来实现标准::原子)。
另请注意,std::atomic
用于确保值在多个处理器内核或多个处理器之间自动更新,这通常不是您想要/可以对更大的数据结构执行的操作。
要在其他数据结构上实现原子操作,您必须使用互斥锁或类似结构来确保处理以“线程原子”方式(不同于“处理器原子”)完成。
您可以创建std::atomic
包含非数字对象的对象。主要限制是包含的类型必须是可简单复制的;松散地说(因为它是这样实现的),这意味着复制memcpy
是可以的,比较memcmp
是有意义的。但是,它不允许您调用存储对象的成员函数。您必须复制存储的对象,进行更新,然后将结果复制回原子对象。