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

C++ 使用std::atomic,是否可以使类的复杂成员函数成为原子函数?,c++,multithreading,atomic,C++,Multithreading,Atomic,有可能做出这样的东西吗 ... class test{ int i; public: test(int k):i(k){}; void my(){ cout<<i; } } atomic<test> kk(0); kk.test(); ... 。。。 课堂测试{ int i; 公众: 测试(intk):i(k){}; 作废我的(){ coutstd::atomic的工作方式是使用处理器提供的特定指令。这些指令仅适用于

有可能做出这样的东西吗

...
class test{
int i;
public:
      test(int k):i(k){};
      void my(){
         cout<<i;
      }
}
atomic<test> kk(0);
kk.test();
...
。。。
课堂测试{
int i;
公众:
测试(intk):i(k){};
作废我的(){

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

还请注意,
std::atomic
的目的是确保跨多个处理器核心或多个处理器以原子方式更新该值,这通常不是您希望/可以对较大的数据结构执行的操作


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

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

还请注意,
std::atomic
的目的是确保跨多个处理器核心或多个处理器以原子方式更新该值,这通常不是您希望/可以对较大的数据结构执行的操作


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

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

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

为什么不尝试一下呢?谢谢,我尝试了这个,它没有
>不是这样的。在kk中没有成员函数测试。所以我不知道如何调用它。所以问。如何从kk调用测试???如果你想要原子函数,你需要使用互斥锁。
atomic
只给你一个。它不会神奇地使一个包含多个整数运算符的函数成为原子的。
std::atomic
定义良好对于任意类型的
Ty
,只要它们可以用
memcpy
进行复制,并与
memcmp
进行平等性比较@WanderingLogic-
std::atomic
只要存储对象的大小足够小,就可以不加锁o确定是否使用锁。不管怎样,我是在回应“
atomic
只对不同大小的整数执行一些操作”的断言.那太窄了。你为什么不试试呢?谢谢,我试过了,但它不起作用。在kk中没有成员函数测试。所以我不知道如何调用它。所以问。如何从kk调用测试???如果你想要原子函数,你需要使用互斥体。
原子
只提供给你。它不会神奇地让一个函数包含更多
std::atomic
对于任意类型的
Ty
都有很好的定义,只要它们可以用
memcpy
进行复制,并与
memcmp
进行平等比较@WanderingLogic-
std::atomic
只要存储对象的大小足够小,就可以实现无锁我为Dinkumware编写的应用程序在所有情况下都使用大小,包括数字类型,以确定是否使用锁。不管怎样,我是在回应一个断言,即“
atomic
只对不同大小的整数执行一些操作”。这太窄了。在OP的示例中,失败的是调用
kk.test()
atomic
与使
test()
函数在没有读取修改更新原子性问题的情况下正确执行完全无关。@WanderingLogic-这就是我最后两句话所说的。在OP的示例中,失败的是调用
kk.test()
atomic
与使
test()
函数在没有读取修改更新原子性问题的情况下正确执行完全无关。@WanderingLogic-这就是我最后两句话所说的。31.8[atomics.types.generic]C++规范中没有任何关于大小限制的任何东西。只有它是简单的复制和移动构造和可赋值。还请注意<代码>静态CONExpRPR BoOL IsAlalWavsHyLoxFiel=实现定义;< /Cult>成员。31.8 [原子类型。类型。通用]C++规范中没有任何关于大小限制的任何东西。只有它是简单的复制和移动构造和可分配的。还请注意<代码>静态CONExpRPR BoOL iSalAWAsSyLoCuFiel=实现定义;< /代码>成员。