【发布时间】:2015-02-03 15:13:15
【问题描述】:
我正在构建一个程序,其中一个变量仅由一个线程修改(原子上,双向全内存屏障),并读取多个线程。读取线程需要原子读取变量还是简单读取就足够了?
通常(我使用 gcc,但我猜这个概念与语言无关)
int a = 0;
在写作线程中:
__atomic_add_fetch (&a, 1, __ATOMIC_SEQ_CST);
在阅读线程中:
int b = __atomic_load_n (&a, __ATOMIC_SEQ_CST);
/ * OR */
int b = a;
我的猜测是,如果唯一的作家在两个方向上都设置了完整的障碍,那么应该没有竞争条件,但我似乎找不到任何证实...
谢谢!
【问题讨论】:
-
一个简单的读取将是一个 UB 的数据竞争。
-
UB 代表什么?
-
这是未定义的行为。
-
根据代码,编译器可以生成代码以将
a加载到寄存器中一次,并且永远不再引用内存位置。在这种情况下,b(保存在寄存器中)永远不会改变。 -
这不是一个真正的问题,如果我想阻止它,我可以将它标记为 volatile。更多的是关于值的加载,而不是加载后会发生什么。
标签: c multithreading gcc atomic