Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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
C++ _interloctedcompareeexchange64的用法_C++_Multithreading_Atomic - Fatal编程技术网

C++ _interloctedcompareeexchange64的用法

C++ _interloctedcompareeexchange64的用法,c++,multithreading,atomic,C++,Multithreading,Atomic,在MSDN上,我看到了 InterlockedCompareExchange64 要求参数64对齐 要不是 _InterlockedCompareExchange64 我看不出对对齐有这样的要求,事实上是这样的 提到为InterlocatedCompareeExchange64提供编译器内部支持 那么,这是否意味着我可以使用_interloctedcompareeexchange64而不必考虑对齐?”因为我不太清楚对齐在这里意味着什么。我很确定这是一个文档错误,而不是两个函数之间的任何直接

在MSDN上,我看到了

InterlockedCompareExchange64
要求参数64对齐

要不是

_InterlockedCompareExchange64 
我看不出对对齐有这样的要求,事实上是这样的 提到为InterlocatedCompareeExchange64提供编译器内部支持


那么,这是否意味着我可以使用_interloctedcompareeexchange64而不必考虑对齐?”因为我不太清楚对齐在这里意味着什么。

我很确定这是一个文档错误,而不是两个函数之间的任何直接区别,因为它们导致完全相同的CMPXCHG8B指令。[当然,假设您希望它在SMP系统上真正是原子的-但它是一个非常专门的指令,所以我怀疑它还有很多其他用途]

这意味着,_下划线版本仅在定义了_M_IA64或_M_AMD64时可用。换句话说,当您将程序定向到64位处理器时


您应该在代码中使用非下划线版本。当您以32位处理器为目标时,该功能将在Windows中实现,您将获得一个可与未对齐的目标一起工作的安全版本。但是,如果您的目标是64位处理器,那么您将自动获得_下划线版本和内部版本。WinBase.h中的宏soup会处理它。

谢谢Mats,这是否意味着我必须使用_aligned_malloc为该函数的三个参数分配地址?这意味着必须确保值在64位边界上对齐。这并不一定意味着它们必须单独分配。通常,编译器会在64位边界上对齐64位值,因此,除非您使用两个
int
而不是一个
long
,或者您一直在玩
#pragma pack()
等。啊,是的,在64位机器上使用64位可以解决这个问题。非常感谢,你帮助理解了这一点。