在线程中使用原子变量
Usage of an atomic variable within threads
考虑一个有三个线程a,B, c的程序。
它们有一个共享的全局对象g
我想在G中使用一个原子变量(I),它由线程B编写,由线程a读取。
我的方法是:
声明i在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
,改变它变得复杂,因为在改变它之后决定何时释放旧数据是安全的。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 类与私有变量的其他类之间的线程安全性
- 全局变量 多读取器 一个写入器多线程安全?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 成员变量在多线程 C++ 时自行更改
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 多个线程可以安全地同时将相同的值写入同一变量吗?
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- C++线程不检测全局变量更改
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- C++多线程程序:变量定义为类成员的隔离错误
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 对全局变量的多线程访问:我应该使用互斥锁吗?
- 子线程中的条件变量等待停止主线程中的执行
- 是局部unordered_map变量线程在C 中安全的线程
- 如何使类静态变量线程安全
- 命名空间中的全局变量 - 线程中的值不同
- 静态变量与堆栈变量:线程安全与堆栈大小
- 共享提升::shared_ptr<>变量线程安全吗?
- 在析构函数中pthead_join()类成员变量线程是否明智?