我想知道:锁定只允许 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_