一位作家,无锁应用中的多个读者

时间:2014-12-05 12:37:25

标签: c multithreading gcc atomic

我正在构建一个程序,其中变量仅由一个线程修改(在两个方向上原子地,完全内存屏障),并读取多个线程。读取线程是否需要原子读取变量或简单读取就足够了?

通常(我使用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;

我的猜测是,如果唯一的作家在两个方向都设置完全障碍,那么应该没有竞争条件,但我似乎无法找到任何确认......

谢谢!

1 个答案:

答案 0 :(得分:1)

为安全起见,您应该使用 seq_cst 获取内存模型进行原子加载。编译器或CPU可以做一些技巧来优化缓存或寄存器的使用,而不是以不同的顺序加载值或加载,因此使用特定于负载的屏障可能是一个好主意。

将变量标记为volatile也可以提供帮助。