InterlockedExchange 与 InterlockedExchangePointer

Posted

技术标签:

【中文标题】InterlockedExchange 与 InterlockedExchangePointer【英文标题】:InterlockedExchange vs. InterlockedExchangePointer 【发布时间】:2012-12-12 10:27:40 【问题描述】:

InterlockedExchangeInterlockedExchangePointer 有什么区别?

if( 0 != InterlockedCompareExchange( ( void** ) &_myVariable
                                   , temp
                                   , 0
                                   ) )

if( 0 != InterlockedCompareExchangePointer( ( void** ) &_myVariable
                                          , temp
                                          , 0
                                          ) )

等价的?

我必须将代码移植到不知道Interlocked[...]Pointer 函数的VC6。

编辑:

根据我自己的经验,我知道 VC6 非常有问题,没有人会再使用它了。

但是,我不是决策者,非常感谢您回答最初的问题。

【问题讨论】:

你必须移植代码... VC6?忘了它。 VC6 已停产,非常有问题,死了。不要为它/用它开发新代码,并从它远离迁移现有项目——从长远来看它更便宜。 你试过msdn.microsoft.com/en-us/library/windows/desktop/ms683590.aspx和msdn.microsoft.com/en-us/library/windows/desktop/ms683609.aspx吗? (另外,AFAICS 第一个无法编译,第二个有多余的演员表) 【参考方案1】:

InterlockedCompareExchange 采用 32 位变量。

InterlockedCompareExchangePointer 采用指针大小变量,根据目标架构不同。

如果您以 32 位和仅 32 位架构为目标,那会很好,但是,当您将目标架构更改为 64 位时,以下代码会编译并表现得很糟糕:

InterlockedCompareExchange( ( LONG volatile * ) _myPointer , 1, 0 ) );

【讨论】:

以上是关于InterlockedExchange 与 InterlockedExchangePointer的主要内容,如果未能解决你的问题,请参考以下文章

找不到名为“interlockedexchange”的入口点

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

同步线程 - InterlockedExchange

InterlockedExchange Visual Studio 2010 内在

32 位 int 类型的 Win API 互锁操作

功能联锁交换