2010-03-09 22 views

Antwort

32
static object object1 = new object(); 
static object object2 = new object(); 

public static void ObliviousFunction() 
{ 
    lock (object1) 
    { 
     Thread.Sleep(1000); // Wait for the blind to lead 
     lock (object2) 
     { 
     } 
    } 
} 

public static void BlindFunction() 
{ 
    lock (object2) 
    { 
     Thread.Sleep(1000); // Wait for oblivion 
     lock (object1) 
     { 
     } 
    } 
} 

static void Main() 
{ 
    Thread thread1 = new Thread((ThreadStart)ObliviousFunction); 
    Thread therad2 = new Thread((ThreadStart)BlindFunction); 

    thread1.Start(); 
    thread2.Start(); 

    while (true) 
    { 
     // Stare at the two threads in deadlock. 
    } 
} 
+0

+1, kam ich auf diese Frage, um so etwas zu beschreiben. Die Reihenfolge des Erwerbs von Schlössern ist in der Praxis sehr verbreitet. Faustregel: Wenn Sie zwei Schlösser gleichzeitig halten müssen, sollten diese in einer vorhersehbaren und konsistenten Reihenfolge erworben und freigegeben werden. – asveikau

6

Von Threading in C#

Am anderen Ende der Skala, separaten Synchronisationskontexten Deadlocks einladen. Hier ein Beispiel:

[Synchronization] 
public class Deadlock : ContextBoundObject { 
    public DeadLock Other; 
    public void Demo() { Thread.Sleep (1000); Other.Hello(); } 
    void Hello() { Console.WriteLine ("hello"); } 
} 
public class Test { 
    static void Main() { 
    Deadlock dead1 = new Deadlock(); 
    Deadlock dead2 = new Deadlock(); 
    dead1.Other = dead2; 
    dead2.Other = dead1; 
    new Thread (dead1.Demo).Start(); 
    dead2.Demo(); 
} 

Da jede Instanz von Deadlock in Test erstellt ist - ein unsynchronisierten Klasse - jeder Instanz Wille bekommt seinen eigenen Synchronisation Kontext und somit seine eigene Sperre. Wenn die beiden Objekte übereinander nennen, es dauert nicht lange, für den Stillstand auftreten (eine Sekunde, um genau zu sein!) Das Problem besonders heimtückisch sein würde, wenn die Deadlock und Test Klassen geschrieben wurden von verschiedene Programmierungsteams. Es kann unvernünftig sein zu erwarten, dass diese verantwortlich für die Test-Klasse zu sein sogar ihrer Transgression bewusst, lassen Sie allein wissen, wie man über die Auflösung es zu lösen. Dies steht im Gegensatz zu expliziten Sperren, wo Deadlocks normalerweise offensichtlicher sind.