Monitor或Lock(this) {}形式实际上调用的是windows底层的CRITICAL_SECTION详见这里.临界区在单核下是性能最好的锁,我boss曾做过多次尝试都无法超过这个锁的性能只能达到接近.但是这个锁在多核下表现并不理想,因为它是这样实现的(我boss查看了汇编)在多核下它会先做50次自旋在锁.可能ms的初衷是在多U情况下一个线程做自旋的时候另一个U就把工作线程的工作做完了.这样性能会很高.但是在多核下效果不佳我觉得和操作系统的调度器实现有关.所以我这个锁的想法就是去掉50次无意义的自旋不浪费CPU的周期这样效率自然会提升.
我boss给这个锁起名叫Unique意思就是只有一个线程可以进入.他的实现仿照CRITICAL_SECTION,第一个进入锁的将引用计数从零置一,后面进入的线程增加引用计数并阻塞,推出锁时只要引用计数大于零就唤醒一个阻塞的线程.代码如下:
public
class
Unique

...
{
int _useCount = 0;
Event_Trigger _trigger = new Event_Trigger();

public override void Lock()

...{
if( InterLocked.Increase(ref this._useCount) != 1 )

...{
this._trigger.Wait();
}
}
public override bool Try_Lock()

...{
return InterLocked.CompareExchange(ref this._useCount, 1, 0) == 0;
}
public override void UnLock()

...{
if(InterLocked.Decrement(ref this._useCount) > 0)
this._trigger.Post();
}
public override void Release()

...{
this._trigger.Close();
}
}
;
其中的Event_Trigger在我的上篇文章有介绍,Event_Trigger就是Semaphore,Wait()相当于WaitOne(),Post()相当于Release().在这个锁中引用计数useCount是个临界条件我们可以把它看成是一个并发事件,如果lock的时候大于1就阻塞,unlock的时候大于0就唤醒.这个事件必然会发生所以就让它发生吧,不需要用绝对时间点的方式进行多次判断.