[英]Usage of an atomic variable within threads
考虑一个包含三个线程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;
如果这些线程同时尝试访问此变量,我的方法是否正确。
像JV说的那样,这取决于你对“正确”的定义。 请参见http://preshing.com/20120612/an-introduction-to-lock-free-programming/ 。 如果它不需要与任何东西同步,你应该使用std::memory_order_relaxed
存储而不是默认的顺序一致性存储,因此它编译为更高效的asm(没有内存屏障指令)。
但是,只要在线程开始之前初始化指针本身,通过指针访问原子结构成员就可以了。
如果结构是全局的,那么不要使用指向它的指针,只需直接访问全局。 具有始终指向相同全局的单独变量是额外的间接级别,没有任何好处。
如果你想改变指针,它也需要是std::atomic<struct foo *> pG
,并且改变它会变得复杂,只要决定在更改它之后何时释放旧数据是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.