Stavo eseguendo il debug di un'applicazione multi-thread e ho trovato la struttura interna di CRITICAL_SECTION
. Ho trovato un membro dei dati LockSemaphore
di CRITICAL_SECTION uno interessante.La sezione critica è sempre più veloce?
Sembra LockSemaphore
è un evento reset automatico (non un semaforo come suggerisce il nome) e il sistema operativo crea questo evento in silenzio quando prima volta che un thread attende su Critcal Section
che è bloccato da qualche altro thread.
Ora, mi chiedo è sezione critica sempre più veloce? Event è un oggetto kernel e ogni oggetto Section critico è associato all'oggetto evento, quindi come Critical Section
può essere più veloce rispetto ad altri oggetti kernel come Mutex? Inoltre, in che modo l'oggetto evento interno influenza effettivamente le prestazioni della sezione Critico?
Ecco la struttura della CRITICAL_SECTION
:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
Ricordare inoltre che i dettagli di implementazione di CriticalSection possono variare da versione a versione del sistema operativo. Può essere istruttivo osservare questi dettagli, ma non fare affidamento su di essi, poiché potrebbero cambiare. –
Sicuramente è un semaforo in NT5 – paulm