CRITICAL_SECTION ロック解除コードのデバッグ チェックを追加しようとしていますが、次のことを試しました。
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
CRITICAL_SECTIONS のデバッグから (VS 2005 では、ほとんどが WindowsXP 上で) (で定義されOwningThread
た構造体のメンバー) の値が、ロックを保持しているスレッドのIDの値であることを「知っています」 。RTL_CRITICAL_SECTION
winnt.h
DWORD
ただし、スレッド ID は(typedef for ) 値で表されunsigned long
ますが、この変数には型HANDLE
(typedef for void*
) があり、上記のコードが機能するにはマクロを使用する必要があります。reinterpret_cast
HandleToULong
basetsd.h
MSDNのドキュメントにも次のように記載されています。
最初のスレッドが EnterCriticalSection ルーチンを呼び出すと、(...) OwningThread が呼び出し元のスレッド ID になります。
では、なぜこれが として定義されているのHANDLE
でしょうか。
編集注: HANDLE / DWORD-Id の不一致は、一部の Windows 内部の既知の不具合であるとポスターが示唆しているステートメントを見つけました。だから多分これはここでも当てはまります:
GetCurrentThreadId は DWORD を返します。これをメッセージでカーネルに送信します。PsLookupThreadByThreadId は HANDLE でスレッド ID を受け取ります... ...
これは Windows API の既知のバグです (I/O Manager API の問題により、フィルター マネージャーにも表示されるため、関連するフィルター マネージャーの DEV にこの問題について話したという点で "既知" です)。 5 億以上のスレッドとプロセス (それらは 1 つの共有ハンドル テーブルを使用します) を持っている場合は問題ありません。たぶん、それが本当の問題になるまでに、私たちは何か違うことを実行するでしょう. [ RE: 64 ビットの HANDLE への ThreadId ? 、08 年 8 月 8 日 14:21、トニー メイソン]