我需要在我的项目中使用InterlockedBitTestAndReset64(),但似乎没有定义。我查看了WinNT.h,但由于以下预处理器语句,定义显示为灰色:
" #if defined(_M_AMD64)&& !定义(RC_INVOKED)&& !定义(MIDL_PASS)"
和
" #if defined(_M_IA64)&& !定义(RC_INVOKED)&& !定义(MIDL_PASS)"
我不知道这是什么意思。
我的项目属性中是否需要设置任何开关?
我使用的是Windows7 x64,而且我使用的是Visual Studio 2010 Professional。 我的CPU是Intel Core2 Quad Q9450。
编辑:PS。我应该提到其他64位函数,如InterlockedAnd64和InterlockedOr64 工作良好。 InterlockedBitAndTestSet64,InterlockedBitTestAndReset64似乎是例外。
谢谢, 卡尔
答案 0 :(得分:4)
定位x64平台时会定义_M_AMD64宏。定位Itanium时会定义_M_IA64宏。两者都是64位处理器。在32位处理器上不支持这种原子操作。您当然可以使用您拥有的处理器和操作系统来定位x64。
答案 1 :(得分:0)
听起来像不正在为x64目标进行编译,所有* 64功能仅适用于x64目标。
答案 2 :(得分:0)
我设法通过使用InterlockedOr64和常规AND运算符来解决问题,我认为结果很好。
实施例: 而不是InterlockedBitTestAndSet64(...):
LONGLONG pattern = 0x0000000000001000;
bool result = InterlockedOr64(ptrToLonglong, pattern) & pattern;
而不是InterlockedBitTestAndReset64(...):
LONGLONG pattern = 0x0000000000001000;
bool result = InterlockedAnd64(ptrToLonglong, ~pattern) & pattern;