2009-12-07 45 views

Trả lời

19

.NET Framework phiên bản 4 bao gồm các lớp mới System.Threading.CountdownEvent.

+0

Tôi sẽ so sánh cả hai câu trả lời và tôi có thể phải trao nó cho bạn (CesarGon) ... có vẻ như bạn là tốt hơn, bởi vì bạn cung cấp một giải pháp được tích hợp vào C# rồi. – Kiril

+0

Đủ công bằng, Lirik. :-) – CesarGon

16

Đây là một thực hiện đơn giản (từ 9 Reusable Parallel Data Structures and Algorithms):

Để xây dựng một chốt đếm ngược, bạn chỉ khởi tạo truy cập của nó đến n, và có từng nhiệm vụ đơn vị trực thuộc nguyên tử sụt lần nó bởi một khi nó kết thúc , ví dụ bằng cách xung quanh hoạt động giảm giá bằng khóa hoặc với cuộc gọi đến Interlocked.Decrement. Sau đó, thay vì thực hiện một hoạt động, luồng có thể giảm và đợi bộ đếm trở thành 0; khi đánh thức, nó sẽ biết rằng n tín hiệu đã được đăng ký với chốt. Thay vì quay về điều kiện này, như trong khi (đếm! = 0), thường là một ý tưởng hay là để cho chuỗi chờ chặn, trong trường hợp này bạn phải sử dụng sự kiện .

public class CountdownLatch { 
    private int m_remain; 
    private EventWaitHandle m_event; 

    public CountdownLatch(int count) { 
     m_remain = count; 
     m_event = new ManualResetEvent(false); 
    } 

    public void Signal() { 
     // The last thread to signal also sets the event. 
     if (Interlocked.Decrement(ref m_remain) == 0) 
      m_event.Set(); 
    } 

    public void Wait() { 
     m_event.WaitOne(); 
    } 
} 
Các vấn đề liên quan