2

プロジェクトで InterlockedBitTestAndReset64() を使用する必要がありますが、定義されていないようです。WinNT.h を調べましたが、次のプリプロセッサ ステートメントが原因で定義がグレー表示されています。

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

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

これが何を意味するのかわかりません。

プロジェクトのプロパティで設定する必要があるスイッチはありますか?

私は Windows7 x64 を使用しており、Visual Studio 2010 Professional を使用しています。私の CPU は Intel Core2 Quad Q9450 です。

編集:PS。InterlockedAnd64 や InterlockedOr64 などの他の 64 ビット関数は問題なく動作することに注意してください。InterlockedBitAndTestSet64、InterlockedBitTestAndReset64 は例外のようです。

ありがとう、カール

4

3 に答える 3

4

_M_AMD64 マクロは、x64 プラットフォームをターゲットにするときに定義されます。_M_IA64 マクロは、Itanium をターゲットにするときに定義されます。どちらも 64 ビット プロセッサです。32 ビット プロセッサでは、このアトミック操作はサポートされていません。お使いのプロセッサと OS で x64 を確実にターゲットにすることができます。

于 2012-10-08T08:18:30.027 に答える
0

x64 ターゲット用にコンパイルしていないように聞こえますが、すべての *64 関数は x64 ターゲットでのみ使用できます。

于 2012-10-08T08:18:57.630 に答える
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 に答える