2010-03-09 4 views
17

Может ли кто-нибудь привести пример того, как на тупиковой ситуации может возникнуть тупик на языке C#?Пример тупика резьбы в C#

+4

Это домашнее задание? –

+1

Он не отметил это как домашнюю работу. – zgnilec

ответ

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, я пришел к этому вопросу, чтобы описать что-то вроде этого. Приобретение блокировки является очень распространенной проблемой на практике. Правило большого пальца: если вам нужно иметь 2 замка, удерживаемых одновременно, их следует приобретать и выпускать в предсказуемом и последовательном порядке. – asveikau

6

От Threading in C#

На другом конце шкалы, отдельных контекстов синхронизации пригласить тупики. Вот пример:

[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(); 
} 

Поскольку каждый экземпляр взаимоблокировки создан в Test - синхронизирован класс - каждый экземпляр будет получает свою собственную синхронизацию контекст, и, следовательно, его собственный замок. Когда два объекта призывают друг друга, это не займет много времени для того тупика произойти (одна секунда, чтобы быть точным!) проблема будет особенно коварная, если Deadlock и испытаний классы были написаны различные команды . Может быть нецелесообразно ожидать, что те , отвечающие за класс испытаний, будут , даже осведомленные об их нарушении, пусть самостоятельно знают, как идти о разрешении . Это в отличие от явных блокировок , где взаимоблокировки обычно более очевидны.

Смежные вопросы