Dies ist ein falsches Bankdatenbankproblem mit Deadlock. Ich habe bereits, was ich denke, ist die Antwort, aber ich bin neugierig, ob dies eine gute Lösung ist. Die Frage stellt, ist die folgende: (oder Prozesse)Verhindern von Deadlock in einer Scheinbankdatenbank
Wie Sie Deadlock im folgenden Code verhindern ?:
void transaction(Account from, Account to, double amount)
{
Semaphore lock1, lock2;
lock1 = getLock(from);
lock2 = getLock(to);
wait(lock1);
wait(lock2);
withdraw(from, amount);
deposit(to, amount);
signal(lock2);
signal(lock1);
}
Die Art und Weise dieses Deadlock ist über zwei Threads werden kann Aufruf der Transaktion() -Methode zur gleichen Zeit mit gegnerischen Konten, dh:
Transaktion (Einsparungen, Prüfung, 1); in Thread 1 und
Transaktion (Überprüfung, Einsparungen, 2); in Thread 2.
Von meinem schlechten Verständnis, denke ich, was passiert und warum es festgefahren ist, weil die Sperre Reihenfolge nicht befolgt wird, da beide Threads versuchen, eine Sperre (von einander?) zu bekommen.
Meine quick and dirty Lösung wäre, die Schleusen außerhalb der Funktion Transaktion zu bewegen(), wo es so aussehen würde, wenn sie aufgerufen:
//somewhere in main
Semaphore lock1, lock2;
lock1 = getLock(from);
lock2 = getLock(to);
wait(lock1);
wait(lock2);
transaction(checking, savings, 2);
signal(lock2);
signal(lock1);
//.....
mit der Transaktion wie folgt aussehen:
void transaction(Account from, Account to, double amount)
{
withdraw(from, amount);
deposit(to, amount);
}
So können sie nie gleichzeitig ausgeführt werden, da die Transaktion technisch der kritische Abschnitt ist. Wenn dies ein Java-Programm wäre, könnten Sie auch Monitore verwenden, indem Sie das Wort nach void in die Funktionsdeklaration einfügen? Funktioniert das? Das scheint ein klügerer Weg zu sein.
Ich mag das auch nicht verstehen, also fühlen Sie sich frei, mich zu schulen, besonders wenn meine Erklärungen nicht genau sind. Vielen Dank.
+1 Dies ist eine einfache und korrekte Lösung. – usr
Ich würde zustimmen, dass es ist, ich weiß nur nicht, ob der Professor in Ordnung mit mir sein würde, die Konto IDs in diesem Kontext zu verwenden, um die Lösung zu bestimmen, da wir ihnen nicht gegeben wurden. In der realen Welt sehe ich jedoch nicht, warum das nicht perfekt funktionieren würde. – montag
Offensichtlich können Sie ein anderes eindeutiges Feld verwenden, das auf dem "Account" @montag vergleichbar ist. Aber ich verstehe die Anforderungen der Frage. Das Verschieben der Sperren innerhalb der Transaktion ist eine andere Lösung. – Gray