2

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

目前我必须做__sync_lock_test_and_set__sync_fetch_and_add让它以原子方式进行读/写,但有问题的 CPU 有 64 位获取和存储指令。

我不想写大量的内联汇编程序(大概我们必须支持的每个 CPU 一个),而#ifs 散布在各处。

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

4

1 回答 1

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”将导致 ud 的“信号 NaN”值,那么您可能会在这样做时遇到异常!

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

于 2013-09-03T14:53:02.033 回答