C 多執行緒同步 二 Mutex

2021-07-25 14:54:00 字數 1282 閱讀 5757

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

經典執行緒同步問題 互斥量mutex include include include long g nnum unsigned int stdcall fun void ppm unsigned int stdcall fun1 void ppm unsigned int stdcall fun2 ...

用mutex同步多執行緒

include include dword winapi threadproc1 lpvoid lpparameter dword winapi threadproc2 lpvoid lpparameter int index 0 int tickets 100 handle hmutex int ...

C 多執行緒 Mutex

dotnet 2010 05 29 19 07 24 閱讀151 字型大小 大 中小訂閱 互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mute...