2010-08-13 33 views
7

cách chủ đề giao tiếp với nhau? họ không sử dụng giá trị của eachother, vậy thì cách giao tiếp giữa chúng là gì?cách chủ đề giao tiếp với eachother?

+0

Ngoài các câu trả lời đã được đưa ra, đánh dấu vào đây cho một e-book miễn phí cho khá một chiều sâu giới thiệu về công trình như thế nào luồng trong C# : [Sách điện tử miễn phí trên C# Threading] (http://www.albahari.com/threading/) – duesouth

Trả lời

1

Chủ đề có thể chia sẻ các giá trị, họ chỉ cần cẩn thận khi làm như vậy. Trong. Net các phương thức phổ biến nhất là câu lệnh lock và lớp Liên khóa.

4

"chúng không sử dụng giá trị của nhau" - cũng có hai luồng trong cùng một quá trình có thể xem các biến phổ biến, vì vậy đó là đánh giá mẫu. Vì vậy, chúng tôi sử dụng đồng bộ hóa khác nhau, khóa, mutices và sempahores để chờ đợi điều kiện và thức dậy chủ đề chờ đợi.

Trong Java, bạn sử dụng các nguyên thủy khác nhau như đồng bộ hóa. Bạn có thể đọc số này tutorial

+0

+1 Tôi không hiểu tại sao thực tế này không được xem xét. – Luca

5

Có một vài cách mà chủ đề có thể giao tiếp với nhau. Danh sách này không đầy đủ, nhưng bao gồm các chiến lược được sử dụng nhiều nhất.

  • bộ nhớ chia sẻ, như một biến hoặc một số cấu trúc dữ liệu khác
  • nguyên thủy đồng bộ, giống như ổ khóa và sempahores
  • Sự kiện, như ManualResetEvent hoặc AutoResetEvent

Bộ nhớ chia sẻ

public static void Main() 
{ 
    string text = "Hello World"; 
    var thread = new Thread(
    () => 
    { 
     Console.WriteLine(text); // variable read by worker thread 
    }); 
    thread.Start(); 
    Console.WriteLine(text); // variable read by main thread 
} 

Đồng bộ hóa nguyên thủy

public static void Main() 
{ 
    var lockObj = new Object(); 
    int x = 0; 
    var thread = new Thread(
    () => 
    { 
     while (true) 
     { 
     lock (lockObj) // blocks until main thread releases the lock 
     { 
      x++; 
     } 
     } 
    }); 
    thread.Start(); 
    while (true) 
    { 
    lock (lockObj) // blocks until worker thread releases the lock 
    { 
     x++; 
     Console.WriteLine(x); 
    } 
    } 
} 

Sự kiện

public static void Main() 
{ 
    var are = new AutoResetEvent(false); 
    var thread = new Thread(
    () => 
    { 
     while (true) 
     { 
     Thread.Sleep(1000); 
     are.Set(); // worker thread signals the event 
     } 
    }); 
    thread.Start(); 
    while (are.WaitOne()) // main thread waits for the event to be signaled 
    { 
    Console.WriteLine(DateTime.Now); 
    } 
} 
+1

+1 cho đầy đủ. –

Các vấn đề liên quan