gpt4 book ai didi

c++ - 在线程中使用原子变量

转载 作者:太空狗 更新时间:2023-10-29 20:54:27 26 4
gpt4 key购买 nike

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

他们有一个共享的全局对象 G。

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

我的方法是:

在 G 中声明 i 为:

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 ,并且就决定何时可以安全地在更改后释放旧数据而言,更改它变得很复杂。

关于c++ - 在线程中使用原子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39051508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com