estoy tratando de añadir un poco de depuración comprobación de un código de desbloqueo CRITICAL_SECTION, y yo intentado el siguiente:¿Por qué el miembro OwningThread de CRITICAL_SECTION de tipo HANDLE, cuando indica la identificación del hilo?
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
De depuración CRITICAL_SECTIONS (con VS 2005, sobre todo en Windows XP) "sé" que el valor de OwningThread
(miembro de la estructura RTL_CRITICAL_SECTION
definida en winnt.h
) es el valor de th ID del subproceso que contiene el bloqueo.
Sin embargo hilo IDs están representados por DWORD
(typedef para unsigned long
) valores, mientras que esta variable tiene el tipo HANDLE
(typedef para void*
) que requiere
un
el uso de la reinterpret_cast
para
HandleToULong
Macro de basetsd.h
para el código de seguridad funcione.
Incluso el MSDN docs Estado:
Cuando el primer subproceso llama a la rutina EnterCriticalSection, (...) OwningThread se convierte en el ID del hilo de la persona que llama.
Entonces, ¿por qué en la tierra se define como HANDLE
?
Editar Nota: He encontrado a statement donde un cartel indica que el MANGO/DWORD-Id desajuste es cierta misfeature conocida de algunos detalles internos de Windows. Así que tal vez este es el caso aquí también:
GetCurrentThreadId devuelve un DWORD, que envío hasta el núcleo en un mensaje . PsLookupThreadByThreadId toma el ID del tema en un mango, ... ...
Se trata de un error conocido de API de Windows ("conocido" en que hablé con el administrador de filtros DEV relevante sobre esto, ya que aparece en Filtro Manager también debido a la API API de E/S problema). Siempre y cuando no tenga más de medio billón de hilos y procesos (ellos utilizan una única tabla de identificador compartido) estarás bien . Quizás para el momento ese sea un problema real, correremos algo diferente. [RE: ThreadId a HANDLE para 64 bit?, 08/08/08 14:21, Tony Mason]
En cualquier caso, reinterpret_cast es exagerado. Un static_cast haría. Ambos HANDLE y DWORD son tipos integrales. –
@ArmenTsirunyan - NO, en VS2005 no se puede usar un static_cast para lanzar un HANDLE a un DWORD: 'error C2440: 'static_cast': no se puede convertir de 'HANDLE' a 'DWORD'' –
Eso es raro. ¿Podría decirme para qué son typedefs? –