C 多執行緒中互斥訊號量的使用

2021-08-03 14:47:51 字數 2434 閱讀 1144

互斥訊號量是一種核心物件,它用來保證乙個執行緒獨佔乙個資源的訪問。在使用互斥訊號量的時候,有四個主要的函式:

(1)createmutex,建立互斥訊號量。

函式原型如下所示:

handle createmutex(

lpsecurity_attributes lpmutexattributes,

bool binitialowner,

lpctstr lpname

);

第乙個引數一般傳入null,表示安全控制。

第二個引數確定互斥量的擁有者,傳入false,那麼互斥量物件內部的執行緒id號將設定為null,遞迴計數設定為0,這意味互斥量不為任何執行緒占用。

第三個引數用來設定互斥量的名稱,在多個程序中的執行緒就是通過名稱來確保它們訪問的是同乙個互斥量。

(2)openmutex,開啟互斥訊號量

函式原型如下所示:

handle openmutex(

dword dwdesiredaccess,

bool binherithandle,

lpctstr lpname

);

函式說明:

第乙個引數表示訪問許可權,對互斥量一般傳入mutex_all_access

第二個引數表示互斥量控制代碼繼承性,一般傳入true即可。

第三個引數表示名稱。某乙個程序中的執行緒建立互斥量後,其它程序中的執行緒就可以通過這個函式來找到這個互斥量。

函式返回值:

成功返回乙個表示互斥量的控制代碼,失敗返回null。

(3)releasemutex,觸發互斥訊號量

函式原型如下所示:

bool releasemutex(

handle hmutex

);

訪問完互斥資源呼叫該函式,表示自己已經使用完互斥資源。

(4)closehandle,清理互斥量

函式原型如下所示:

bool closehandle(

handle hmutex

);

對於互斥量來講如果正在被使用則為無訊號狀態,被釋放後變為有訊號狀態。當等待成功後 waitforsingleobject 函式會將互斥量置為無訊號狀態,這樣其他的執行緒就不能獲得使用權而需要繼續等待。

以兩個視窗賣票為例,總票數100。

從執行結果可以看到,兩個視窗同時賣票出現了混亂,執行結果錯誤。

下面使用互斥訊號量對票數進行加鎖操作。

對票數加鎖之後,執行結果正確。

多執行緒之使用互斥訊號量Sample

code author lin yiqian created 2009 09 16 describe 執行緒結束時會自動釋放互斥量 演示 include include using namespace std dword winapi threadfun lpvoid lpparameter han...

使用System V訊號量實現多執行緒互斥

posix thread中提供了非常強大的執行緒互斥機制,如 pthread mutex x pthread cond x 以及semaphore sem wait sem post 等。在同一程序內的多執行緒程式設計非常方便靈活。但對於跨程序的執行緒互斥問題就變得麻煩了。其實主流的linux在核心...

多執行緒 互斥量 訊號量和條件變數

通常用於互斥訪問 pthread mutex t m mutex pthread mutex intit m mutex,null pthread mutex lock m mutex pthread mutex unlock m mutex pthread mutex destory m mute...