是否可以使用std::atomic将类的复杂成员函数变为原子?

Is it possible with std::atomic, make a complex member function of a class atomic?

本文关键字:函数 成员 复杂 可以使 std atomic 是否      更新时间:2023-10-16

有可能做出这样的东西吗?

...
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的目的是确保值在多个处理器内核或多个处理器之间自动更新,这通常不是您希望/可以对较大的数据结构做的事情。

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

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