互斥量(mutex)是一種核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權。互斥量包含乙個使用數量,乙個執行緒 id 和乙個遞迴計數器。id用於標識系統中的哪個執行緒當前擁有互斥物件,遞迴計數器用於指明該執行緒擁有互斥物件的次數。互斥量的行為特性與臨界段相同,但是互斥量屬於核心物件,而臨界段屬於使用者方式物件。這意味著互斥量的執行速度比臨要慢,但是這也意味著不同程序中的多個執行緒能夠訪問單個互斥量,並且這意味著對等待訪問資源的執行緒可以設定乙個超時值。
互斥物件有許多用途,屬於最常用的核心物件之一。通常來說,它們用於保護由多個執行緒訪問的記憶體塊。如果多個執行緒要同時訪問記憶體塊,記憶體塊中的資料就可能遭到破壞。互斥物件能夠保證訪問記憶體塊的任何執行緒擁有對該記憶體塊的獨佔訪問權,這樣就能夠保證資料的完整性。
要使用互斥量,必須先呼叫createmutex建立此互斥量
handle createmutex(
lpsecurity_attributes lpmutexattributes,
bool binitialowner,
lpctstr lpname
);其中:
lpmutexattributes引數指向乙個security_attributes結構,這個結構在98中將被忽略,在nt/2k中它指定乙個安全描述,如果忽略這個,mutex將得到乙個預設的安全描述。
binitialowner引數如果為true表示此執行緒將擁有此互斥量,因此互斥量將處於無訊號狀態。任何在此互斥量上等待的執行緒都將被掛起,直到建立此互斥量的執行緒釋放它。如果此引數為false,就表示此互斥量不被任何執行緒擁有,因而建立後處於有訊號狀態。第乙個等待此互斥量的執行緒將立刻獲得此互斥量的所有權並繼續執行。
lpname引數要麼是null,要麼是乙個標誌互斥量的以0為結束符的字串做為名字。
在呼叫createmutex後要立即呼叫getlasrerror,如果返回值為error_already_exists,就表明沒有建立新的互斥量物件。
當目前擁有對資源的訪問權的執行緒不再需要它的訪問權時,它必須呼叫releasemutex函式來釋放該互斥物件
bool releasemutex(handle hmutex);
和臨界區一樣,互斥量有著與之相聯絡的所有權計數,如果某執行緒擁有了互斥量再次呼叫waitforsingleobject時,該互斥量的引用計數將增加,所以必須呼叫相同次數的releasemutex來釋放此互斥量。
當互斥量使用完後呼叫closehandle關閉互斥量。
互斥量同步程序
要使用互斥量來同步程序,兩個程序中的某個程序必須擁有同一互斥量物件的程序相關控制代碼。可以通過兩種方法獲得此控制代碼。一是在第二個執行緒建立互斥量時使用與第乙個互斥量一樣的lpname,此時就不再建立新的互斥量而是返回標識已有互斥量的程序相關控制代碼。另一種獲得的方法是使用
handle openmutex(
dword dwdesiredaccess, // mutex_all_access或synchronize(nt only)
bool binherithandle, // 指明此程序建立的任一子程序是否應該繼承此互斥量。
lpctstr lpname // 互斥量的名字
);呼叫openmutex時,系統將掃瞄所有現存的互斥量,如果找到lpname指定的互斥量。就返回給呼叫執行緒,如果找不到就返回null。
程序同步 互斥量
程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread mutex init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。pthread mutexattr tmattr 型別 用於定義mutex鎖的 屬性 int pthread mutexattr init ...
程序同步與互斥
程序同步與互斥 首先,我們看乙個例子 程序p1 p2公用乙個變數count,初始值為0 p1 p2兩個程序的執行順序是隨機的,p1 p2可能順序執行或交錯執行。由圖可見,不同的執行順序,count值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...
程序同步與互斥
為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...