是否可以使用std :: atomic,创建类原子的复杂成员函数?

时间:2013-06-10 11:41:00

标签: c++ multithreading atomic

是否可以制作这样的东西?

...
class test{
int i;
public:
      test(int k):i(k){};
      void my(){
         cout<<i;
      }
}
atomic<test> kk(0);
kk.test();
...

如果这不可能,那么如何调用函数以使其成为原子?

2 个答案:

答案 0 :(得分:3)

std::atomic的工作方式是它使用处理器提供的某些指令。这些指令仅适用于特定大小的整数(不同的处理器对您可以做什么和不能做什么有不同的限制和规则,在某些架构中,处理器架构甚至可能只需要使用互斥或​​类似的功能来实现的std ::原子)。

另请注意,std::atomic的用途是用于确保在多个处理器核心或多个处理器之间原子地更新值,这通常不是您希望/可以使用更大的数据结构。

要在其他数据结构上实现原子操作,您必须使用互斥或​​类似结构来确保以“线程原子”方式完成处理(与“处理器原子”不同)。

答案 1 :(得分:0)

可以创建包含非数字对象的std::atomic个对象。主要限制是所包含的类型必须是可轻易复制的;松散地说(因为这是它的实现方式),这意味着使用memcpy进行复制是可以的,与memcmp进行比较是有意义的。但是,它不允许您在存储的对象上调用成员函数。您必须复制存储的对象,执行更新,然后将结果复制回原子对象。