我想添加一些調試檢查一個CRITICAL_SECTION解鎖代碼,我試過如下:爲什麼類型HANDLE的CRITICAL_SECTION的OwningThread構件中,當表示該線程ID?
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
從調試CRITICAL_SECTIONS(在VS 2005,主要是WindowsXP的)我「知道」的價值OwningThread
(在winnt.h
定義的RTL_CRITICAL_SECTION
結構的成員)是個線程的ID持有鎖的值。
然而線程ID由DWORD
(的typedef unsigned long
)表示的值,而該變量具有類型HANDLE
(的typedef void*
)規定
一個
使用reinterpret_cast
爲
HandleToULong
宏從basetsd.h
用於上述代碼工作。
即使MSDN docs狀態:
當第一個線程調用EnterCriticalSection的程序,(...) OwningThread成爲主叫方的線程ID。
那麼爲什麼地球上這是定義爲HANDLE
?
編輯注:我發現a statement其中一張海報表明,手柄/ DWORD-ID不匹配是一些Windows內部的一些已知的不良特性。所以,也許是這樣的話在這裏太:
GetCurrentThreadId返回一個DWORD,這是我在 消息發送到內核。 PsLookupThreadByThreadId採用線程ID在一個HANDLE,... ...
這是一個已知的Windows API的bug(「已知」在我跟 相關過濾經理DEV這一點,因爲它顯示了過濾 經理以及因爲I/O管理器API的問題。)只要你 沒有超過半十億左右的線程和進程(他們 使用一個單一的共享句柄表),你會被罰款。也許到時候 這是一個真正的問題,我們將運行一些不同的東西。 [RE:線程ID來處理64位的? 08年8月8日14:21,託尼梅森]
無論如何reinterpret_cast是矯枉過正。 static_cast會做。 HANDLE和DWORD都是完整的類型。 –
@ArmenTsirunyan - 不,在VS2005中,你不能使用static_cast將句柄轉換爲DWORD:'錯誤C2440:'static_cast':無法從'HANDLE'轉換爲'DWORD'' –
這很奇怪。你能告訴我他們的typedefs是什麼嗎? –