在线程中使用原子变量
Usage of an atomic variable within threads
考虑一个包含三个线程 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说的,这取决于你对"correct"的定义是什么。参见 http://preshing.com/20120612/an-introduction-to-lock-free-programming/。如果它不需要与任何东西同步,你应该使用 std::memory_order_relaxed
存储而不是默认的顺序一致性存储,因此它编译为更高效的 asm(无内存屏障指令)。
但是,是的,通过指针访问原子结构成员是可以的,只要指针本身在线程启动之前被初始化。
如果结构是全局的,那么不要使用指向它的指针,直接访问全局即可。拥有一个始终指向同一个全局变量的单独变量是一种额外的间接级别,没有任何好处。
如果你想改变指针,它也需要std::atomic<struct foo *> pG
,并且改变它变得复杂,就决定在改变它之后什么时候释放旧数据是安全的。
考虑一个包含三个线程 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说的,这取决于你对"correct"的定义是什么。参见 http://preshing.com/20120612/an-introduction-to-lock-free-programming/。如果它不需要与任何东西同步,你应该使用 std::memory_order_relaxed
存储而不是默认的顺序一致性存储,因此它编译为更高效的 asm(无内存屏障指令)。
但是,是的,通过指针访问原子结构成员是可以的,只要指针本身在线程启动之前被初始化。
如果结构是全局的,那么不要使用指向它的指针,直接访问全局即可。拥有一个始终指向同一个全局变量的单独变量是一种额外的间接级别,没有任何好处。
如果你想改变指针,它也需要std::atomic<struct foo *> pG
,并且改变它变得复杂,就决定在改变它之后什么时候释放旧数据是安全的。