在线程中使用原子变量

Usage of an atomic variable within threads

本文关键字:变量 线程      更新时间:2023-10-16

考虑一个有三个线程a,B, c的程序。

它们有一个共享的全局对象g

我想在G中使用一个原子变量(I),它由线程B编写,由线程a读取。

我的方法是:

声明i在G中为:

std::atomic<int> i;

使用指向G的指针从线程B写入

G* pG; //this is available inside A and B 
pG->i = 23;

用同样的方法从线程A读取。

int k = pG->i;

如果这些线程试图同时访问这个变量,我的方法是否正确?

就像JV说的,这取决于你对"正确"的定义。见http://preshing.com/20120612/an-introduction-to-lock-free-programming/。如果它不需要与任何东西同步,你应该使用std::memory_order_relaxed存储而不是默认的顺序一致性存储,所以它编译成更有效的asm(没有内存屏障指令)。

但是,通过指针访问原子结构成员是可以的,只要指针本身在线程开始之前初始化。

如果结构体是全局结构,那么不要使用指向它的指针,直接访问全局结构体。有一个单独的变量总是指向同一个全局变量,这是一个额外的间接级别,没有任何好处。

如果你想改变指针,它也需要是std::atomic<struct foo *> pG,改变它变得复杂,因为在改变它之后决定何时释放旧数据是安全的。