寫個比Monitor效能好的鎖

來源:互聯網
上載者:User
  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就喚醒.這個事件必然會發生所以就讓它發生吧,不需要用絕對時間點的方式進行多次判斷.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.