AutoResetEvent作为C#中的Lock替换?

Roy*_*mir 9 .net c# multithreading locking waithandle

我想知道:锁定只允许1个线程进入代码区域

等待句柄用于发信号:

信令是指一个线程等待它收到另一个线程的通知.

所以我心想,这可以用来取代锁吗?

就像是 :

Thread number 1 --please enter ( autoreset --> autlock)
dowork...
finish work...
set signal  to invite the next thread
Run Code Online (Sandbox Code Playgroud)

所以我写了这个:

/*1*/   static EventWaitHandle _waitHandle = new AutoResetEvent(true);
/*2*/   
/*3*/   volatile int i = 0;
/*4*/   void Main()
/*5*/   {
/*6*/   
/*7*/       for (int k = 0; k < 10; k++)
/*8*/       {
/*9*/           var g = i;
/*10*/           Interlocked.Increment(ref i);
/*11*/           new Thread(() = > DoWork(g)).Start();
/*12*/   
/*13*/       }
/*14*/   
/*15*/       Console.ReadLine();
/*16*/   }
/*17*/   
/*18*/   
/*19*/   void DoWork(object o)
/*20*/   {
/*21*/       _waitHandle.WaitOne();
/*22*/       Thread.Sleep(10);
/*23*/       Console.WriteLine((int) o + "Working...");
/*24*/       _waitHandle.Set();
/*25*/   
/*26*/   }
Run Code Online (Sandbox Code Playgroud)

如你所见:第21行,第24行是锁的替代品.

题 :

  • 它是有效的替代品吗?(不是我会替换lock ,但想了解用法场景)
  • 我什么时候应该使用?

谢谢.

奇怪,但SO不包含任何问题 _lock vs EventWaitHandle_

Han*_*ant 12

不要去那儿.锁的一个重要特性是它提供了公平性.换句话说,一个合理的保证,争夺锁的线程得到保证,他们最终可以获得它.Monitor类提供了这样的保证,由CLR中的等待队列实现.而Mutex和Semaphore提供了由操作系统实现的这种保证.

WaitHandles 提供这样的保证.如果锁争用是非常有害的,同一个线程可以反复获取它,其他线程可以永远饿死.

使用适当的锁定同步对象.等待句柄只应用于信令.