ein gemeinsamer Weg ist, wenn Sie Schlösser verschachtelt sind, die nicht in der gleichen Reihenfolge erworben werden . Thread 1 könnte Sperre A erhalten und Thread 2 könnte Sperre B erhalten, und sie würden sich blockieren.
var a = new object();
var b = new object();
lock(a) {
lock(b) {
}
}
// other thread
lock (b) {
lock(a) {
}
}
bearbeiten: Nicht-Sperre Beispiel .. mit Waithandles. Nehmen wir an, Sokrates und Descartes hätten Steaks, und sie beide, gut ausgebildete Philosophen, benötigen sowohl eine Gabel als auch ein Messer, um zu essen. Sie haben jedoch nur einen Satz Silberbesteck, also ist es möglich, dass jeder ein Utensil ergreift und dann für immer darauf wartet, dass der andere sein Utensil übergibt.
die Dining Philosopher's Problem
WaitHandle fork = new AutoResetEvent(), knife = new AutoResetEvent();
while(Socrates.IsHungry) {
fork.WaitOne();
knife.WaitOne();
Eat();
fork.Set();
knife.Set();
}
// other thread
while(Descartes.IsHungry) {
knife.WaitOne();
fork.WaitOne();
Eat();
knife.Set();
fork.Set();
}
@DotNetBeginner: Es gibt nicht so etwas wie C# .NET. –
Vielen Dank für die Korrektur: D – DotNetBeginner