sto cercando di aggiungere un po 'di debug il controllo di un codice di sblocco CRITICAL_SECTION, e ho provato quanto segue:Perché il membro OwningThread di CRITICAL_SECTION di tipo HANDLE, quando sta denotando l'ID del thread?
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
Da debug CRITICAL_SECTIONS (con VS 2005, per lo più su WindowsXP) I "so" che il valore di OwningThread
(membro della struttura RTL_CRITICAL_SECTION
definita in winnt.h
) è il valore di ID del thread che contiene il blocco.
Tuttavia infilare ID sono rappresentati da DWORD
(typedef per unsigned long
) valori mentre la variabile è di tipo HANDLE
(typedef per void*
) richiedono un
l'utilizzo del reinterpret_cast
per
HandleToULong
macro dal basetsd.h
per il codice suddetto funzioni.
Anche il MSDN docs Stato:
Quando il primo thread chiama la routine EnterCriticalSection, (...) OwningThread diventa l'ID del thread del chiamante.
Quindi perché sulla terra è definito come HANDLE
?
Modifica nota: ho trovato a statement dove un manifesto suggerisce che la maniglia/DWORD-Id mancata corrispondenza è una certa misfeature nota di alcuni interne di Windows. Quindi forse questo è il caso anche qui:
GetCurrentThreadId restituisce un valore DWORD, che mando fino al kernel in un messaggio . PsLookupThreadByThreadId prende l'ID del thread in un manico, ... ...
Si tratta di un bug noto API di Windows ("conosciuto" in quanto ho parlato con il relativo DEV filtro direttore circa questo problema, come si vede in Filtro Manager anche a causa del problema dell'API I/O Manager. Finché l'utente non ha più di mezzo miliardo di thread e processi (essi utilizzano utilizzano una singola tabella di handle condivisa), si andrà bene . Forse per il momento questo è un vero problema, eseguiremo qualcosa di diverso. [RE: ThreadId to HANDLE per 64 bit?, 08 ago 08 14:21, Tony Mason]
In ogni caso reinterpret_cast è eccessivo. Farebbe un static_cast Sia HANDLE che DWORD sono tipi interi. –
@ArmenTsirunyan - NO, in VS2005 non è possibile utilizzare un static_cast per trasmettere un HANDLE a un DWORD: 'errore C2440: 'static_cast': impossibile convertire da 'HANDLE' a 'DWORD'' –
Questo è strano. Potresti dirmi per cosa sono i typedef? –