Próbuję dodać debug Sprawdzanie kodu odblokowującego CRITICAL_SECTION i próbowałem następujące:Dlaczego człon OwingsThread z CRITICAL_SECTION typu HANDLE, kiedy oznacza identyfikator wątku?
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
Od debugowania CRITICAL_SECTIONS (z VS 2005, głównie na WindowsXP) I „wiedzieć”, że wartość OwningThread
(element struktury RTL_CRITICAL_SECTION
zdefiniowany w winnt.h
) to wartość th ID wątku z blokadą.
jednak gwint identyfikatory są przedstawione DWORD
(typedef do unsigned long
) wartości w trakcie tej zmiennej typu HANDLE
(typedef dla void*
) wymagających
zastosowanie reinterpret_cast
do
HandleToULong
makro z basetsd.h
na powyższy kod do pracy.
Nawet stan MSDN docs:
Kiedy pierwszy wątek wywołuje procedurę EnterCriticalSection, (...) OwningThread staje się gwint ID dzwoniącego.
Dlaczego więc, na ziemi, jest to zdefiniowane jako HANDLE
?
Edit Uwaga: znalazłem a statement gdzie plakat sugeruje, że uchwyt/DWORD-Id niedopasowanie jest jakiś znany misfeature niektórych wewnętrznych Windows. Więc może to jest w tym przypadku zbyt:
GetCurrentThreadId zwraca DWORD, które wysyłam do jądra w wiadomości . PsLookupThreadByThreadId zajmuje identyfikator wątku w obsłudze, ... ...
Jest to znany bug API systemu Windows („wiadomo”, że rozmawiałem z odpowiedniego menedżera filtr DEV o tym, jak to przedstawia się w Filtruj także Menedżera z powodu problemu z interfejsem API I/O Managera). Tak długo, jak nie ma więcej niż pół miliarda wątków i procesów (one używają jednej udostępnionej tabeli uchwytów) będzie dobrze . Być może do czasu to prawdziwy problem, będziemy prowadzić coś innego. [RE: ThreadId do UCHWYTU na 64-bitowy?, 08 sie 08 14:21, Tony Mason]
W każdym przypadku reinterpret_cast jest przesadą. Wystąpiłby static_cast. Oba HANDLE i DWORD są typami integralnymi. –
@ArmenTsirunyan - NIE, w VS2005 nie można użyć static_cast do rzutowania UCHWYTU na DWORD: 'error C2440: 'static_cast': nie można przekonwertować z 'HANDLE' na 'DWORD'' –
To dziwne. Czy możesz mi powiedzieć, o co im chodzi? –