使用gcc在32位模式下对64位值进行原子读/写

时间:2013-09-03 08:55:12

标签: c gcc atomic

gcc中是否有任何内在或其他方式说服它进行64位读取和原子写入而不是2位32位写入? (至少在一两个地方)。

目前我不得不做__sync_lock_test_and_set__sync_fetch_and_add以使其以原子方式进行读/写操作,但有问题的CPU有64位提取和存储指令。

我不想写#ifs传播的内联汇编程序(大概是我们必须支持的每个CPU一个)。

我目前正在使用gcc 4.4.6,并且不太可能在短期内升级。

1 个答案:

答案 0 :(得分:0)

如果你使用“long long”,内存访问将不是原子的。

然而,在使用64位CPU时,即使在32位程序中,也许“双”内存访问可能是原子的:

union {
    long long ll;
    double d;
} u;

u.ll = my_value;
*(double *)&my_long_long_variable = u.d;

但是,如果此示例中的数字“my_value”将导致u.d的“信令NaN”值,则以这种方式执行此操作时可能会出现异常!

也许编译器甚至不会将FPU寄存器用于此代码。在这种情况下,内存访问将不是原子的,并且将需要汇编程序编程。您肯定需要使用FPU寄存器或XMM / MMX / ...寄存器进行原子64位访问。