2010-03-09 44 views

Trả lời

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, tôi đã đến câu hỏi này để mô tả một cái gì đó như thế này. Thứ tự mua lại khóa là một mối quan tâm rất phổ biến trong thực tế. Quy tắc của ngón tay cái: nếu bạn cần có 2 ổ khóa được giữ cùng một lúc, chúng sẽ được mua và phát hành theo thứ tự có thể dự đoán và nhất quán. – asveikau

6

Từ Threading in C#

Ở đầu kia của quy mô, bối cảnh đồng bộ hóa riêng biệt mời sự bế tắc. Dưới đây là một ví dụ:

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

Bởi vì mỗi thể hiện của Deadlock là tạo trong vòng thử nghiệm - một lớp không đồng bộ - mỗi trường hợp sẽ được tự đồng bộ hóa ngữ cảnh của nó, và do đó, khóa riêng của mình. Khi hai đối tượng gọi nhau, nó không mất nhiều thời gian cho bế tắc xảy ra (một giây, chính xác!) Vấn đề sẽ đặc biệt là ngớ ngẩn nếu khóa chết và kiểm tra lớp học được viết bởi khác nhau nhóm lập trình. Có thể là không hợp lý để mong đợi những người chịu trách nhiệm về lớp Kiểm tra là thậm chí còn biết về sự vi phạm của họ, hãy để một mình biết cách giải quyết nó. Điều này trái ngược với các khóa rõ ràng , trong đó deadlock thường là rõ ràng hơn.