gpt4 book ai didi

c - InterlockedExchange() 类型函数/内部函数的 MSDN 文档不一致?

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:11 33 4
gpt4 key购买 nike

首先,我们有 InterlockedExchange64();

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683593%28v=vs.85%29.aspx

LONGLONG __cdecl InterlockedExchange64( __inout LONGLONG volatile *Target, __in LONGLONG Value );

其次,我们有编译器内部函数 _InterlockedExchange64(),请注意没有使用 volatile;

http://msdn.microsoft.com/en-us/library/1s26w950%28v=vs.80%29.aspx

__int64 _InterlockedExchange64( __int64 * Target, __int64 Value );

接下来,我们有 InterlockedExchangePointer(),它与 ​​InterlockedExchange64() 一样,使用 volatile。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683609%28v=vs.85%29.aspx

PVOID __cdecl InterlockedExchangePointer( __inout  PVOID volatile *Target, __in PVOID Value );

但现在我们来看指针交换的内在函数 _InterlockedExchangePointer(),这里我们看到使用了 volatile!

http://msdn.microsoft.com/en-us/library/853x471w.aspx

void * _InterlockedExchangePointer( void * volatile * Target, void * Value );

在所有情况下,基本指令都是相同的,那么给出了什么?文档错误?

GCC 指令没有提到 volatile 用于交换,但是他们也没有提到它用于 CAS!所以这没有帮助。

我的观点是 CAS 目标是易变的,因为您只能在运行时知道交换是否会发生;但是原子交换不应该是易变的,因为目标总是更新的(即使它的值没有改变),所以编译器没有不确定性。

我还看到 InterlockedIncrement() 的函数是易变的,但指令不是。 CAS 的内在函数对其目的地具有易变性。

最佳答案

MSDN 充斥着大多数小的文档错误(例如,__readfsdword 仅在 VS 2005 文档下被标记为内核),您真正应该注意的是编译器使用的定义,在在这种情况下,intrin.h 中的定义(取自 VS2010 Ultimate SP1):

__MACHINEI(long _InterlockedExchange(long volatile *, long)) 
__MACHINEIA64(__int64 _InterlockedExchange64(__int64 volatile *, __int64))

正如我们所见,它们确实是必需的 volatile 指针。

最后要注意的是,您所有的链接都是 VS 2005 文档(对于较旧的内在函数,默认由 google 链接),因此请确保使用页面顶部的下拉菜单切换到最新版本。

关于c - InterlockedExchange() 类型函数/内部函数的 MSDN 文档不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912822/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com