我正在用 C 语言编写一个程序。为了简单起见:有几个变量可供许多线程读写。每次写入其中一个时,它都会通过原子交换(GCC 原子操作、同步和交换)写入。每次读取其中一个变量时是否需要使用原子负载,或者原子写入是否足以避免在写入过程中读取数据?
请注意,任何需要使用这些变量之一的数据的地方首先复制该值:
int success = 0;
while ( !success ) {
int x = shared_x;
... work with x, result in y ...
success = cmp_swap( &shared_x, x, y );
}
我的问题不是关于数据竞赛,我不担心我可能会丢失数据。我担心 shared_x 的值可能会在我阅读的过程中发生变化。假设它是一个 8 字节整数,这是否是一个潜在的问题:假设 shared_x 是一个 64 位整数,8 字节。我的 x = shared_x 是否有可能复制前 4 个字节,然后以原子方式写入 shared_x,然后该语句完成读取第二个 4 个字节。这将导致 x 包含 shared_x 的旧值的前 4 个字节,以及新 shared_x 的最后 4 个字节。我怀疑原子交换中的内存屏障(http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html - 使用__sync_bool_compare_and_swap)足以防止这种情况......但我我不确定。