2

我需要在我的项目中使用 InterlockedBitTestAndReset64() 但它似乎没有被定义。我查看了 WinNT.h,但由于以下预处理器语句,定义是灰色的:

" #if 定义(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS) "

" #if 定义(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS) "

我不知道这是什么意思。

我需要在我的项目属性中设置任何开关吗?

我在 Windows7 x64 上,并且正在使用 Visual Studio 2010 Professional。我的 CPU 是 Intel Core2 Quad Q9450。

编辑:PS。我应该提到其他 64 位函数,如 InterlockedAnd64 和 InterlockedOr64 工作正常。InterlockedBitAndTestSet64、InterlockedBitTestAndReset64 似乎是个例外。

谢谢,卡尔

4

3 回答 3

4

_M_AMD64 宏是在您以 x64 平台为目标时定义的。_M_IA64 宏是在您以 Itanium 为目标时定义的。两者都是 64 位处理器。在 32 位处理器上不支持这种原子操作。您当然可以使用您拥有的处理器和操作系统来定位 x64。

于 2012-10-08T08:18:30.027 回答
0

我设法通过使用 InterlockedOr64 和常规 AND 运算符解决了这个问题,我认为结果很好。

示例:代替 InterlockedBitTestAndSet64(...):

LONGLONG pattern = 0x0000000000001000;
bool result = InterlockedOr64(ptrToLonglong, pattern) & pattern;

而不是 InterlockedBitTestAndReset64(...):

LONGLONG pattern = 0x0000000000001000;
bool result = InterlockedAnd64(ptrToLonglong, ~pattern) & pattern;
于 2012-10-08T11:10:54.033 回答
0

听起来您没有为 x64 目标编译,所有 *64 函数仅适用于 x64 目标。

于 2012-10-08T08:18:57.630 回答