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();
}
} ;
... {
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();
}
} ;