繁体   English   中英

在线程中使用原子变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM