Non sono sicuro di cosa intendi per recuperare , perché dal momento che sei in una situazione di stallo - sei ovviamente in uno stato in cui due thread dipendono l'uno dall'altro per completare le attività correnti . Quindi il recupero sarebbe per uno di loro (o entrambi ...) non completare il compito.
In molti casi, specialmente nei sistemi basati su eventi incorporati, il rilevamento viene eseguito tramite il watchdog hardware che riavvia il sistema. Questo può essere considerato un meccanismo di recupero.
Ovviamente puoi essere meno rigoroso e invece di riavviare il sistema, spegnere uno dei thread offensivi (o tutti) e riavviarli, assicurandoti che la situazione di deadlock possa essere evitata in futuro (eliminando il male input per esempio).
Oppure puoi semplicemente sbloccare la chiamata di blocco e lasciare che i thread vengano eseguiti con (potenzialmente) dati corrotti. Di nuovo, dipende dal tuo sistema e dai motivi del deadlock.
La linea di fondo - watchdog (hardware o software) è la soluzione, ma se stai usando la versione del software - devi assicurarti che non sia mai bloccata da sola (per esempio: eseguire su una CPU dedicata per esempio) .
Ah, e il migliore di tutti è, naturalmente, non entrare completamente in una situazione di stallo. Puoi verificare il tuo codice usando il model checking o le simulazioni, ma ovviamente è più facile dirlo e farlo, anche se hai verificato il modello, potresti ancora avere bug nell'implementazione del codice reale ....