Domanda

Sto eseguendo il debug di un problema di deadlock e lo stack di chiamate mostra che i thread sono in attesa di alcuni eventi.

Il codice sta usando la sezione critica come primitiva di sincronizzazione Penso che ci sia qualche problema qui. Inoltre il debugger punta a una sezione critica di proprietà di qualche altro thread, ma il conteggio dei blocchi è -2. Secondo la mia comprensione, il conteggio dei blocchi & Gt; 0 significa che la sezione critica è bloccata da uno o più thread.

Quindi c'è qualche possibilità che io stia guardando la giusta sezione critica che potrebbe essere il colpevole in deadlock.

In quali scenari una sezione critica può avere un conteggio dei blocchi negativo?

È stato utile?

Soluzione

Suppongo che tu stia parlando della classe CCriticalSection in MFC. Penso che tu stia guardando la giusta sezione critica. Ho scoperto che il conteggio dei blocchi della sezione critica può diventare negativo se il numero di chiamate alla funzione Lock () è inferiore al numero di chiamate Unlock (). Ho scoperto che questo generalmente accade nel seguente tipo di codice:

void f()
{
   CSingleLock lock(&m_synchronizer, TRUE);
   //Some logic here
   m_synchronizer.Unlock();
}

A prima vista questo codice sembra perfettamente sicuro. Tuttavia, si noti che sto usando direttamente il metodo Unlock () di CCriticalSection invece del metodo Unlock () di CSingleLock. Ora ciò che accade è che quando la funzione viene chiusa, CSingleLock nel suo distruttore chiama nuovamente Unlock () della sezione critica e il suo conteggio dei blocchi diventa negativo. Dopo questo l'applicazione avrà una pessima forma e cominceranno a succedere cose strane. Se si utilizzano sezioni critiche MFC, verificare questo tipo di problemi.

Altri suggerimenti

Attenzione: da Windows Server 2003 (per sistema operativo client questo è Vista e più recenti ) il significato di LockCount è cambiato e -2 è un valore completamente normale, comunemente visto quando un thread è entrato in una sezione critica senza attendere e nessun altro thread è in attesa del CS. Vedi Visualizzazione di una sezione critica :

  

In Microsoft Windows Server 2003 Service Pack 1 e versioni successive 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 svegliato per questo blocco. Se questo bit è 0, è stato svegliato un thread per questo blocco; se è 1, nessun thread è stato svegliato.
  •   
  • I bit rimanenti sono il complemento del numero di thread in attesa del blocco.
  •   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top