2009-12-07 15 views

Respuesta

19

El .NET Framework versión 4 incluye la nueva clase System.Threading.CountdownEvent.

+0

Voy a comparar ambas respuestas y es posible que deba adjudicartela (CesarGon) ... parece que la tuya es mejor, porque ofreces una solución integrada en C#. – Kiril

+0

Eso es justo, Lirik. :-) – CesarGon

16

Aquí es una implementación simple (de 9 Reusable Parallel Data Structures and Algorithms):

Para construir un pestillo de cuenta atrás, que acaba de inicializa su contador de n, y tienen cada tarea subordinada atómicamente decremento por uno cuando termina , , por ejemplo, rodeando la operación de decremento con un candado o con una llamada a Enclavamiento.Decreto. Luego, en lugar de una operación de toma, un subproceso podría disminuir y esperar para que el contador se convierta en cero; cuando se despierte , sabrá que n señales se han registrado con el pestillo. En lugar de girar en esta condición, como en while (count! = 0), por lo general es una buena idea dejar que el hilo de espera bloquee, en cuyo caso tendrá que usar un evento.

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