Estaba depurando una aplicación de subprocesos múltiples y encontré la estructura interna de CRITICAL_SECTION
. Encontré el miembro de datos LockSemaphore
de CRITICAL_SECTION uno interesante.¿La sección crítica es siempre más rápida?
Parece que LockSemaphore
es un evento de restablecimiento automático (no un semáforo como su nombre indica) y el sistema operativo crea este evento en silencio cuando por primera vez un hilo espera en Critcal Section
que está bloqueado por algún otro hilo.
Ahora, me pregunto ¿la sección crítica es siempre más rápida? El evento es un objeto del kernel y cada objeto de la sección Critical está asociado con el objeto del evento, ¿cómo puede ser más rápido el Critical Section
en comparación con otros objetos kernel como Mutex? Además, ¿cómo afecta el objeto de evento interno el rendimiento de la sección Crítica?
Aquí es la estructura de la CRITICAL_SECTION
:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
Recuerde también que los detalles de implementación de CriticalSection pueden variar de una versión a otra del sistema operativo. Puede ser instructivo observar estos detalles, pero no confíe en ellos, ya que pueden cambiar. –
Sin duda es un semáforo en NT5 – paulm