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 不提供这样的保证.如果锁争用是非常有害的,同一个线程可以反复获取它,其他线程可以永远饿死.
使用适当的锁定同步对象.等待句柄只应用于信令.