写个比Monitor性能好的锁

  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, 10== 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就唤醒.这个事件必然会发生所以就让它发生吧,不需要用绝对时间点的方式进行多次判断.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值