使用gcc以32位模式对64位值进行原子读/写
gcc中是否有任何内在的或其他的方法可以说服它以原子方式进行64位读写,而不是以32位写的方式进行?(至少在一个或两个地方) 目前,我必须执行使用gcc以32位模式对64位值进行原子读/写,c,gcc,atomic,C,Gcc,Atomic,gcc中是否有任何内在的或其他的方法可以说服它以原子方式进行64位读写,而不是以32位写的方式进行?(至少在一个或两个地方) 目前,我必须执行\uuuuuu sync\u lock\u test\u and\u set和\uuuuuu sync\u fetch\u and\u add来让它以原子方式执行读/写操作,但所讨论的CPU有64位fetch和store指令 我不希望使用#ifs编写大量的内联汇编程序(我们必须支持的每个CPU大概有一个内联汇编程序) 我目前使用的是gcc 4.4.6,短期
\uuuuuu sync\u lock\u test\u and\u set
和\uuuuuu sync\u fetch\u and\u add
来让它以原子方式执行读/写操作,但所讨论的CPU有64位fetch和store指令
我不希望使用#ifs编写大量的内联汇编程序(我们必须支持的每个CPU大概有一个内联汇编程序)
我目前使用的是gcc 4.4.6,短期内不太可能升级。如果使用“long-long”,内存访问将不会是原子的
但是,当使用64位CPU(即使在32位程序中)时,“双重”内存访问可能是原子的:
但是,如果本例中的数字“my_value”将导致u.d的“signaling NaN”值,则这样做时可能会出现异常
也许编译器甚至不会对这段代码使用FPU寄存器。在这种情况下,内存访问将不是原子的,需要汇编程序编程。您肯定需要使用FPU寄存器或XMM/MMX/。。。为原子64位访问注册。简单的答案是否定的,因为有几个原因,至少是为目标CPU创建特殊指令。复杂的答案是什么是您的目标CPU,gcc是否为它们设置了特殊标志?你要么做你正在做的事情,要么创建适当的函数CPU特定的
asm{}
wrapperser。他们为“同步”、“获取”和“添加”创建了特殊说明。哦,对了,你正在使用安腾CPU。。。愚蠢的我。。。它们确实支持long
作为类型(请参阅),并且应该生成原子代码,该代码应该可以处理64位值,但这些是我正在使用的bodges。我只想要一个简单的取货和储存。如果downvoter可以解释原因,则为读取获取并添加0似乎有些过分了?
union {
long long ll;
double d;
} u;
u.ll = my_value;
*(double *)&my_long_long_variable = u.d;