是否可以使用std::atomic将类的复杂成员函数变为原子?
Is it possible with std::atomic, make a complex member function of a class atomic?
有可能做出这样的东西吗?
...
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
进行比较是有意义的。但是,它不允许在存储对象上调用成员函数。您必须复制存储的对象,执行更新,然后将结果复制回原子对象。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针