2011-09-13 18 views
7

Esiste una circostanza in cui il campo LockCount di una struttura RTL_CRITICAL_SECTION in Windows possa essere legittimamente negativo?In quali circostanze una sezione critica di Windows può avere un conteggio dei blocchi negativo?

Stiamo monitorando un incidente MOLTO elusivo e un sintomo che stiamo vedendo è un CS con un LockCount negativo. Al momento dello schianto, il conteggio è -6, ma sembra essere regolarmente -1, -2, ecc.

Prima di andare a caccia dopo, supponendo che sia una cosa molto cattiva per questo a si verificano, voglio solo verificare che tale ipotesi sia corretta. Riesco a trovare poche informazioni sul funzionamento interno di RTL_CRITICAL_SECTION.

risposta

11

Il conteggio dei blocchi negativi è un comportamento normale in alcune versioni di Windows. Nota che il significato di questo campo è cambiato durante la vita di Windows (vedi sotto).

L'interpretazione di questi campi privati ​​è un lavoro complicato e si può trarre vantaggio dall'utilizzo di strumenti di debug di sezione critica dedicati.

Ad esempio, vedere questo MSDN article fornisce alcuni dettagli. In particolare, penso che mostri perché un valore di -6 è perfettamente plausibile.

Alcuni estratti pertinenti:

sezioni critici possono essere visualizzati in modalità utente da una varietà di metodi differenti. Il significato esatto di ogni campo dipende dalla versione di Microsoft Windows che stai utilizzando.

......

In Microsoft Windows 2000 e Windows XP, il campo LockCount indica il numero di volte che ogni thread è chiamato la routine EnterCriticalSection per questa sezione critica, meno uno. Questo campo inizia a -1 per una sezione critica sbloccata. Ogni chiamata di EnterCriticalSection incrementa questo valore; ogni chiamata di LeaveCriticalSection lo decrementa. Ad esempio, se LockCount è 5, questa sezione critica è bloccata, un thread l'ha acquisita e cinque thread aggiuntivi sono in attesa di questo blocco.

......

In Microsoft Windows Server 2003 Service Pack 1 e versioni successive di di Windows, il campo LockCount viene analizzato come segue:

  • Il bit più basso mostra lo stato di blocco . Se questo bit è 0, la sezione critica è bloccata; se è 1, la sezione critica non è bloccata.
  • Il bit successivo mostra se un thread è stato risvegliato per questo blocco. Se questo bit è 0, allora un thread è stato risvegliato per questo blocco; se è 1, nessun thread è stato risvegliato.
  • I bit rimanenti sono quelli a complemento del numero di thread in attesa del blocco.

Si passa poi a spiegare come interpretare un conteggio di blocco di -22. Quindi, in sintesi, è più difficile di quanto tu possa pensare!

5

Da here, è una spiegazione parte:

LockCount Questo è il campo più importante in una sezione critica. Inizializzato ad un valore di -1; un valore pari a 0 o maggiore indica che la sezione critica è posseduta o posseduta. Quando non è uguale a -1, , il campo OwningThread (questo campo è stato definito in modo errato in WINNT.H, dovrebbe essere un DWORD anziché un HANDLE) contiene il thread ID proprietario di questa sezione critica. Il delta tra questo campo e il valore di (RecursionCount -1) indica quanti thread aggiuntivi sono in attesa di acquisire la sezione critica.

+2

"Un valore pari a 0 o maggiore indica che la sezione critica è posseduta o posseduta" potrebbe essere stata vera una volta ma non è più valida per Windows moderno. –

+0

Questa risposta è obsoleta e dovrebbe essere cancellata. –

Problemi correlati