写个比Monitor性能好的锁

http://tech.ddvip.com   2008年09月06日    社区交流

本文详细介绍写个比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, 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就唤醒.这个事件必然会发生所以就让它发生吧,不需要用绝对时间点的方式进行多次判断.

来源:blog.csdn    作者:傅晗    责编:豆豆技术应用

正在加载评论...