Come garantire il successo dei processi dopo che si è verificata un'eccezione di deadlock?

2

Qualunque sia il linguaggio di programmazione e qualunque sia il database, il concetto dovrebbe essere lo stesso:

Ho 2 thread, ognuno dei quali blocca alcune entità di database e inserisce nuovi dati nel database.
Supponiamo che il fatto che quei thread siano eseguiti simultaneamente può causare eccezioni deadlock.

Ovviamente, l'azione principale che possiamo fare prima di tutto è analizzare il codice in profondità per trovare una buona alternativa evitando qualsiasi deadlock.
Ma a volte, non possiamo davvero evitarli.

Devo rilevare l'eccezione e riprovare il processo in questione?
A prima vista, sarebbe accettabile, ma ... e se i processi in conflitto venissero riprodotti contemporaneamente, di nuovo altri deadlock (il serpente si morde la coda)?

Che cosa è un buon modo per assicurarsi che i processi abbiano esito positivo?

    
posta Mik378 13.08.2014 - 20:37
fonte

2 risposte

3

Soluzione ingenua: fai in modo che entrambi i thread attenderanno una quantità di tempo casuale prima di riprovare. Alla fine un thread andrà prima dell'altro (probabilmente prima o poi.)

    
risposta data 13.08.2014 - 20:54
fonte
1

Implementa una sorta di meccanismo di timeout o dead-man.

Ad esempio, ecco un metodo Enqueue (semplificato) su una coda di blocco:

public void Enqueue(T item)
{
    int count = 0;

    lock (_locker)
    { 
        while (queue.Count >= MaximumSize)
        {
            Monitor.Wait(_locker), 100) // Wait for 1/10 of a second. 
            count++;
            if (count >= 100) // Try for 10 seconds
            {
                throw new DeadlockDetectedException();
            }
        }

        queue.Enqueue(item);
        Monitor.PulseAll(_locker);
    } 
}
    
risposta data 13.08.2014 - 20:52
fonte