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

而等待句柄是用于发信号的……



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

就像是 :

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

所以我这样写:
/*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*/   }

如您所见:#21,#24行是锁的替代品。

问题 :
  • 它是有效的替代品吗? (不是我将替换lock,但想了解使用情况)
  • 什么时候应该使用每个?

  • 谢谢你。

    奇怪,但是SO不包含有关_lock vs EventWaitHandle_的问题

    最佳答案

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

    WaitHandles会为而不是提供此类保证。如果争用锁,这将是非常有害的,同一线程可以反复获取它,而其他线程可能会永远饿死。

    对锁使用适当的同步对象。等待句柄应仅用于信令。

    关于c# - AutoResetEvent作为C#中的锁替代品?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17273933/

    10-11 18:10