【发布时间】:2013-02-08 20:45:06
【问题描述】:
我正在用 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)足以防止这种情况发生......但我不确定。
【问题讨论】:
标签: c multithreading atomic thread-synchronization compare-and-swap