zoukankan      html  css  js  c++  java
  • EventWaitHandle类

    EventWaitHandle类

         表示一个线程同步事件。该类存在于mscorlib.DLL中。

         EventWaitHandle类允许线程通过发信号的方式互相通信。 通常,一个或多个线程在EventWaitHandle上被阻止,直到一个未阻止的线程通过调用Set()方法,来释放一个或多个被阻止的线程。线程可以通过调用SignalAndWait()方法(该方法为静态函数)以原子操作的方式,向EventWaitHandle发出信号,然后在它上面阻止。

         以终止的EventWaitHandle的行为取决于它的重置模式,在释放单个等待线程后,用EventResetMode.AutoReset标志创建的EventWaitHandle在终止时会自动地重置,用EventResetMode.ManualReset标志创建的EventWaitHandle一直保持终止状态,直到它的Reset函数被调用。

         自动重置时间提供对资源的独占访问,如果没有线程等待时,自动重置事件处于终止状态。则该事件一直保持终止状态,直到某个线程尝试在该事件上等待,该事件释放线程,并立即重置,以阻止后面的线程。

         手动重置事件类似于入口,当事件不处于终止状态时,在该事件上等待的线程则被阻止,当事件处于终止状态时,所有等待的线程均被释放,而事件一直保持终止状态(即后边的线程不阻止),直到它的Reset方法被调用,如果一个线程必须完成某项活动时,其他线程才能继续执行,则使用手动重置事件。

         EventWaitHandle对象可以与其静态函数:WaitAll和WaitAny方法一起使用。

     MSDN示例:


      1 using System;
      2 using System.Threading;
      3 
      4 public class Example
      5 {
      6     // The EventWaitHandle used to demonstrate the difference
      7     // between AutoReset and ManualReset synchronization events.
      8     //
      9     private static EventWaitHandle ewh;
     10 
     11     // A counter to make sure all threads are started and
     12     // blocked before any are released. A Long is used to show
     13     // the use of the 64-bit Interlocked methods.
     14     //
     15     private static long threadCount = 0;
     16 
     17     // An AutoReset event that allows the main thread to block
     18     // until an exiting thread has decremented the count.
     19     //
     20     private static EventWaitHandle clearCount = 
     21         new EventWaitHandle(false, EventResetMode.AutoReset);
     22 
     23     [MTAThread]
     24     public static void Main()
     25     {
     26         // Create an AutoReset EventWaitHandle.
     27         //
     28         ewh = new EventWaitHandle(false, EventResetMode.AutoReset);
     29 
     30         // Create and start five numbered threads. Use the
     31         // ParameterizedThreadStart delegate, so the thread
     32         // number can be passed as an argument to the Start 
     33         // method.
     34         for (int i = 0; i <= 4; i++)
     35         {
     36             Thread t = new Thread(
     37                 new ParameterizedThreadStart(ThreadProc)
     38             );
     39             t.Start(i);
     40         }
     41 
     42         // Wait until all the threads have started and blocked.
     43         // When multiple threads use a 64-bit value on a 32-bit
     44         // system, you must access the value through the
     45         // Interlocked class to guarantee thread safety.
     46         //
     47         while (Interlocked.Read(ref threadCount) < 5)
     48         {
     49             Thread.Sleep(500);
     50         }
     51 
     52         // Release one thread each time the user presses ENTER,
     53         // until all threads have been released.
     54         //
     55         while (Interlocked.Read(ref threadCount) > 0)
     56         {
     57             Console.WriteLine("Press ENTER to release a waiting thread.");
     58             Console.ReadLine();
     59 
     60             // SignalAndWait signals the EventWaitHandle, which
     61             // releases exactly one thread before resetting, 
     62             // because it was created with AutoReset mode. 
     63             // SignalAndWait then blocks on clearCount, to 
     64             // allow the signaled thread to decrement the count
     65             // before looping again.
     66             //
     67             WaitHandle.SignalAndWait(ewh, clearCount);
     68         }
     69         Console.WriteLine();
     70 
     71         // Create a ManualReset EventWaitHandle.
     72         //
     73         ewh = new EventWaitHandle(false, EventResetMode.ManualReset);
     74 
     75         // Create and start five more numbered threads.
     76         //
     77         for(int i=0; i<=4; i++)
     78         {
     79             Thread t = new Thread(
     80                 new ParameterizedThreadStart(ThreadProc)
     81             );
     82             t.Start(i);
     83         }
     84 
     85         // Wait until all the threads have started and blocked.
     86         //
     87         while (Interlocked.Read(ref threadCount) < 5)
     88         {
     89             Thread.Sleep(500);
     90         }
     91 
     92         // Because the EventWaitHandle was created with
     93         // ManualReset mode, signaling it releases all the
     94         // waiting threads.
     95         //
     96         Console.WriteLine("Press ENTER to release the waiting threads.");
     97         Console.ReadLine();
     98         ewh.Set();
     99 
    100     }
    101 
    102     public static void ThreadProc(object data)
    103     {
    104         int index = (int) data;
    105 
    106         Console.WriteLine("Thread {0} blocks.", data);
    107         // Increment the count of blocked threads.
    108         Interlocked.Increment(ref threadCount);
    109 
    110         // Wait on the EventWaitHandle.
    111         ewh.WaitOne();
    112 
    113         Console.WriteLine("Thread {0} exits.", data);
    114         // Decrement the count of blocked threads.
    115         Interlocked.Decrement(ref threadCount);
    116 
    117         // After signaling ewh, the main thread blocks on
    118         // clearCount until the signaled thread has 
    119         // decremented the count. Signal it now.
    120         //
    121         clearCount.Set();
    122     }
    123 }
  • 相关阅读:
    csuoj 漫漫上学路
    sql函数
    sql基本
    查看webdriver API
    Jmeter应用-接口测试
    http协议
    Jmeter .jmx 改为.jtl
    Jmeter遇到打不开的问题
    测试要点
    apt-get安装mysql
  • 原文地址:https://www.cnblogs.com/pengyou8696/p/1892200.html
Copyright © 2011-2022 走看看