再看c#中的lock monitor 和mutex

1.簡介

在開發項目的時候,很多時候會遇到高併發的情況,這就會用到多線程技術,必然也就會牽着到 資源的同步問題,以c#未開發語言的項目中,有下面三種解決方案,用lock關鍵字,使用monitor類,使用mutex類,至於這三者間的聯繫和區別,適用場合,相信很多人都模模糊糊的,下面我們一起學習一下吧

2.monitor方式

我們之所以選擇monitor開始,是基於下面的考慮,首先我們明白的是,lock是基於monitor的,我們只有搞明白了monitor才能更好的理解lock,通過msdn或者.net framework的源碼我們知道monitor是靜態類,裏面的成員都是靜態的,我麼長用到的方法和解釋如下:

Enter重載方法           作用:monitor採用鎖機制,這些重載方法的作用是給公用資源加上互斥鎖,拿到鎖之後,就執行臨界區的代碼,否則一直阻塞

Exit方法                      作用:釋放當前線程對公用資源的互斥鎖,方法調用後,其他線程或者本線程(指的是異步情況)有一個就可以給公用資源加上互斥鎖了

TryEnter重載方法      作用:該方法的意思是,嘗試着獲取資源的互斥鎖,在指定的時間內(不指定就默認無限大,阻塞)獲取了就返回true執行下面的臨界區代碼(這個方法調用後和釋放鎖之間的代碼都是臨界區代碼),否則,返回false,執行下面的代碼(沒有獲取到鎖,下面的代碼不是臨界區代碼)

Wait重載方法             作用:該方法需要在臨界區代碼中使用,意思是,釋放已經獲取的互斥鎖,在指定的時間內再次申請該互斥鎖,申請到立即執行後面的臨界區代碼,到了點還沒申請到,一直阻塞

Pulse方法                   作用:通知申請互斥鎖的隊列中的一個線程,公用資源的可用狀態發生了變化,具體是哪一個有操作系統決定,會根據線程的優先級等來判定

PulseAll方法              作用:通知所有等待線程,個人理解,主要意思在於通知申請共享鎖的線程

下面來個小例子

   try
            {
                Monitor.Enter(obj);
                //臨界區資源
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                Monitor.Exit(obj);
            }
注意:obj需要是引用類型變量,因爲值類型變量,執行enter時,會包裝成object對象,多個線程多次鎖定1的object,是多個對象,不是同一個對象,和想要鎖定同一個對象不和,但是lock做了限制,只能是引用變量

3.lock方式

下面用連個小例子說明,他們是等價的

   try
            {
                Monitor.Enter(obj);
                DoSomething();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                Monitor.Exit(obj);
            }

lock(obj){
DoSomething();
}


看到了吧,他們之間就這點區別,lock只是一個語法,也只有編譯器能懂,最終也是編譯成monitor方式

4.mutex類

估計這個大家都不常用,我們還是有了解的必要的,他能幫助我們解決2個問題,同一個win系統間,不同進程間的資源(這裏的資源應該是獨立同步進程的文本、註冊表或者其他資源)同步,再者他能解決同一個進程間,不同線程間的同步問題,但他不能解決一個線程的同步問題(比如異步時),固第二種作用不常用,那麼他是如何實現不同進程間的資源同步的那,這就是它和monitor的不同之處,

A.實現機制不一樣,monitor是鎖機制,mutex是令牌機制,

B.一個系統只有一個令牌,獲得的令牌的mutex可以向下執行,有點給要執行代碼的mutex自己加鎖的意思,而鎖可以是多個滴

簡單使用:

var mut = new Mutex();
mut.WaitOne();
//臨街解碼
mut.ReleaseMutex();

總結:

上面聊了聊資源同步的問題,希望對有需要的人有所幫助吧,

發佈了171 篇原創文章 · 獲贊 252 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章