在线程中使用原子变量

时间:2016-08-20 07:09:16

标签: c++ multithreading atomic stdatomic

考虑一个包含三个线程A,B,C的程序。

他们有一个共享的全球对象G.

我想在G中使用原子变量(i),它由线程B写入并由A读取。

我的方法是:

在G中声明我:

std::atomic<int> i;

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

G* pG; //this is available inside A and B 

pG->i = 23;

使用相同的方法从线程A中读取它。

int k = pG->i;

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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