考虑一个包含三个线程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;
如果这些线程同时尝试访问此变量,我的方法是否正确。?
答案 0 :(得分:4)
std::memory_order_relaxed
存储而不是默认的顺序一致性存储,因此它编译为更高效的asm(没有内存屏障指令)。
但是,只要在线程开始之前初始化指针本身,通过指针访问原子结构成员就可以了。
如果结构是全局的,那么不要使用指向它的指针,只需直接访问全局。拥有一个总是指向同一个全局的单独变量是一个额外的间接层,没有任何好处。
如果你想更改指针,它也需要std::atomic<struct foo *> pG
,并且更改它变得复杂,只要决定在更改它之后何时释放旧数据是安全的。