Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gcc以32位模式对64位值进行原子读/写_C_Gcc_Atomic - Fatal编程技术网

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

使用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,短期

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,短期内不太可能升级。

如果使用“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;