Mutex 和 monitor的區別

2021-06-08 15:44:22 字數 1079 閱讀 8394

monitor和lock多用於鎖定被呼叫端,而mutex則多用鎖定呼叫端。

lock (this)

或者是用monitor也是一樣的,如下:

monitor.enter(this);

//do something

monitor.exit(this); (monitor的好處是可以用tryenter(this,timeout))

這就是鎖定被呼叫函式的特性,即只能保證每次被乙個執行緒呼叫,這就是所謂的強佔式。同一時間只能有同一thread lock **塊(這裡是this),其他thread執行到此**塊去要等待占用的thread release**塊。需要注意的是,本thread是可以多次lock**塊的。

mutex:

mutex.waitone();

//do something

mutex.releasemutex();

mutex只能互斥執行緒間的呼叫,但是不能互斥本執行緒的重複呼叫,即thread1中waitone()只對thread2中的waitone()起到互斥的作用,但是thread1並不受本wainone()的影響,可以呼叫多次,只是在呼叫結束後呼叫相同次數的releasemutex()就可以了。

互斥體mutex和事件物件eventwaithandler屬於核心物件,利用核心物件進行執行緒同步,執行緒必須要在使用者模式和核心模式間切換,所以一般效率很低,但利用互斥物件和事件物件這樣的核心物件,可以在多個程序中的各個執行緒間進行同步。

互斥體mutex類似於乙個接力棒,拿到接力棒的執行緒才可以開始跑,當然接力棒一次只屬於乙個執行緒(thread affinity),如果這個執行緒不釋放接力棒(mutex.releasemutex),那麼沒辦法,其他所有需要接力棒執行的執行緒都知道能等著看熱鬧。

mutex是乙個令牌,當乙個執行緒拿到這個令牌時執行,另外想拿到令牌的執行緒就必須等待,直到拿到令牌的執行緒釋放令牌。沒有所有權的執行緒是無法釋放令牌的。

mutex(false,」string」)中的string是令牌的關鍵,或者可以叫令牌名,因為mutex是跨程序的,整個系統中只會有唯一的令牌存在所以,也就是說你在乙個應用程式中的乙個執行緒中得到了mutex的所有權,那在另外乙個執行緒中的另外的執行緒想得到他就必須要等待。

互斥鎖Mutex和讀寫鎖RWMutex區別

引用一下golang互斥鎖和讀寫鎖效能分析中關於互斥鎖和讀寫鎖的定義,比較清楚 1.互斥鎖有兩種操作,獲取鎖和釋放鎖 2.當有乙個goroutine獲取了互斥鎖後,任何goroutine都不可以獲取互斥鎖,只能等待這個goroutine將互斥鎖釋放 3.互斥鎖適用於讀寫運算元量差不多的情況 4.讀寫...

mutex和condition的用法

分享一下用到的mutex和condition用法。mutex一般有兩種使用情況,一種是單獨使用,保護臨界區。一種是和condition配合使用,可以等待某condition拿到之後再向下走。condition 有兩種signal形式,single和 broadcast,下面例子是signal的,做個...

mutex和spin lock的區別

mutex和spin lock的區別和應用 sleep waiting和busy waiting的區別 2011 10 19 11 43 訊號量mutex是sleep waiting。就是說當沒有獲得mutex時,會有上下文切換,將自己 加到忙等待佇列中,直到另外乙個執行緒釋放mutex並喚醒它,而...