我正在构建一个程序,其中变量仅由一个线程修改(在两个方向上原子地,完全内存屏障),并读取多个线程。读取线程是否需要原子读取变量或简单读取就足够了?
通常(我使用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;
我的猜测是,如果唯一的作家在两个方向都设置完全障碍,那么应该没有竞争条件,但我似乎无法找到任何确认......
谢谢!
答案 0 :(得分:1)
为安全起见,您应该使用 seq_cst 或获取内存模型进行原子加载。编译器或CPU可以做一些技巧来优化缓存或寄存器的使用,而不是以不同的顺序加载值或加载,因此使用特定于负载的屏障可能是一个好主意。
将变量标记为volatile
也可以提供帮助。