gcc中是否有任何内在或其他方式说服它进行64位读取和原子写入而不是2位32位写入? (至少在一两个地方)。
目前我不得不做__sync_lock_test_and_set
和__sync_fetch_and_add
以使其以原子方式进行读/写操作,但有问题的CPU有64位提取和存储指令。
我不想写#ifs传播的内联汇编程序(大概是我们必须支持的每个CPU一个)。
我目前正在使用gcc 4.4.6,并且不太可能在短期内升级。
答案 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位访问。