gcc 中是否有任何内在或其他方式可以说服它以原子方式进行 64 位读写而不是 2 个 32 位写入?(至少在一两个地方)。
目前我必须做__sync_lock_test_and_set
并__sync_fetch_and_add
让它以原子方式进行读/写,但有问题的 CPU 有 64 位获取和存储指令。
我不想写大量的内联汇编程序(大概我们必须支持的每个 CPU 一个),而#ifs 散布在各处。
我目前正在使用 gcc 4.4.6,短期内不太可能升级。
如果您使用“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”将导致 ud 的“信号 NaN”值,那么您可能会在这样做时遇到异常!
也许编译器甚至不会为这段代码使用 FPU 寄存器。在这种情况下,内存访问将不是原子的,需要汇编程序编程。您肯定需要使用 FPU 寄存器或 XMM/MMX/... 寄存器来进行原子 64 位访问。