Chiarimento sui mutex gerarchici

di il
4 risposte

Chiarimento sui mutex gerarchici

Salve, stavo vedendo questo articolo per capire il funzionamento dei mutex gerarchici, da usare per evitare la maggior parte dei deadlock.
Per come sono stati costruiti, il mutexA non può essere bloccato se è già stato bloccato mutexB, ma ci sono alcune cose che non mi sono chiare.

1) La variabile threadLevel (inizializzata a 0) è dichiarata thread_local, quindi ogni thread avrà la sua? Se fosse così, ogni nuovo thread la vedrebbe al suo valore iniziale e il controllo isLockValid() andrebbe sempre a buon fine.

2) Se anche i mutex vengono bloccati nell'ordine giusto, non è detto che verranno anche liberati nell'ordine inverso. Per esempio un thread dalla durata di 1 secondo blocca mutexA e un altro dalla durata di 2 secondi blocca mutexB. Per il secondo thread il valore di previousLevel sarà quello di mutexA.level, che verrà ripristinato alla fine, quindi mutexA non potrà più venir bloccato.

Potreste aiutarmi a sciogliere questi dubbi? vi ringrazio.

4 Risposte

  • Re: Chiarimento sui mutex gerarchici

    1) Si, ogni thread avrà una sua variabile specifica pertanto ogni nuovo mutex di quel tipo supererà il controllo.

    2) Se non vengono liberati in ordine inverso, allora viene generata l'eccezione. Il che è voluto, altrimenti si avrebbe un deadlock che quell'implementazione vuole evitare (cosa ribadita nelle ultime righe dell'articolo).
  • Re: Chiarimento sui mutex gerarchici

    Mi sono reso conto ora che la classe è dichiarata nel thread principale, così come le due istanze, quindi il controllo non avviene in t1 e t2, ma prima che questi vengano chiamati.
    Quanto al secondo punto, l'esempio non corrisponde propriamente a quello che proponevo io. Nel mio entrambi i thread vanno a buon fine e i mutex vengono rilasciati, il problema si avrebbe dopo, dato che threadLevel non verrebbe più ripristinato a zero.
  • Re: Chiarimento sui mutex gerarchici

    Non capisco che intendi. Quando il mutex è rilasciato (e questo è garantito dalla lock_guard<>), la sua unlock() provvede a ripristinare il valore di threadLevel a previousLevel che è il valore originario della variabile thread local. E' solo quando si verifica un deadlock che questo non succede.
  • Re: Chiarimento sui mutex gerarchici

    Ho capito il funzionamento, dopo un po' di prove.
    Dunque i mutex gerarchici fanno in modo che all'interno dello stesso thread vengano chiamati nell'ordine giusto, se così non fosse, due thread rischierebbero il deadlock. Se la chiamata segue l'ordine giusto, può succedere che un thread possa attendere per un po' che l'altro finisca, ma non a tempo indefinito.
Devi accedere o registrarti per scrivere nel forum
4 risposte