互斥量的使用《轉》

2021-09-08 23:40:55 字數 2921 閱讀 2981

1、預備知識

臨界區非常適合同一程序中對資料的序列訪問,它的速度很快。然而,也許你想要使某些應用程式與機器中的其它事件或者其它程序取得同步,這時你就要使用一些核心物件來同步執行緒。核心物件包括:

.程序

.執行緒

.檔案

.檔案變化通知(file change notification)

.控制台輸入(console input)

.互斥量(mutex)

.訊號量(semaphore)

.事件(event)

每個物件在任何時候都可以處於兩種狀態之一:有訊號(signaled)和無訊號(not signaled)。執行緒能被置於睡眠狀態直到乙個物件變成有訊號的。

執行緒主要使用下面兩個函式來使自己睡眠,以便等待核心物件變成有訊號的:

dword waitforsingleobject(

handle hhandle, // 等待的核心變數的控制代碼

dword dwmilliseconds // 等候的時間,如果是0,只測試下狀態,如果是infinite,則一直等待直到有訊號

); 和

dword waitformultipleobjects(

dword ncount, //檢查核心物件的數目,最大值為64

const handle *lphandles, // 核心物件控制代碼陣列的指標

bool bwaitall, // 等待的標誌

dword dwmilliseconds // 同waitforsingleobject

); waitforsingleobject的返回值為:

返回值: 定義: 含義:

wait_object_0 0x00000000 物件到達訊號狀態

wait_timeout 0x00000102 物件沒有在dwmilliseconds內達到有訊號狀態

wait_abandoned 0x00000080 物件是乙個互斥量,由於它被放棄了而達到了有訊號狀態

wait_failed 0xffffffff 發生了錯誤,可以呼叫getlasterror得到擴充套件錯誤資訊

waitformultipleobjects和waitforsingleobject類似,不過它等待若干個物件變成有訊號的或等乙個列表物件的物件中的某乙個變成有訊號的。bwaitall指定是等待列表中的乙個達到狀態還是等待所有的,若為true則等待所有的,為false等待直到物件中至少乙個變成有訊號的。

waitformultipleobjects的返回值為:

返回值: 定義: 含義:

wait_object_0(wait_object_0+cobjects-1) 0x00000000 當是等待所有物件變成有狀態時,這一值表明等待成功完成。當是等待任一物件時,返回值是變得有訊號物件的在lphandles所指控制代碼陣列的下標

wait_timeout 0x00000102 物件或物件們沒有在dwmilliseconds內達到有訊號狀態

wait_abandoned_0(wait_abandoned_0+cobjects-1) 0x00000080 物件是乙個互斥量,由於它被放棄了而達到了有訊號狀態。返回值情況似類上面的wait_object_0,分兩種情況。

wait_failed 0xffffffff 發生了錯誤,可以呼叫getlasterror得到擴充套件錯誤資訊

2、互斥量

互斥量和臨界區很相似,只不過它們可以被用來同步多個程序間的資料訪問。為此,兩個程序間的某個執行緒必須擁有同一互斥量物件的程序相關控制代碼。

3、使用互斥量

要使用互斥量,必須先呼叫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,就表明沒有建立新的互斥量物件。

當要釋放乙個互斥量的所有權時呼叫bool releasemutex(handle hmutex)。和臨界區一樣,互斥量有著與之相聯絡的所有權計數,如果某執行緒擁有了互斥量再次呼叫waitforsingleobject時,該互斥量的引用計數將增加,所以必須呼叫相同次數的releasemutex來釋放此互斥量。當互斥量使用完後呼叫closehandle關閉互斥量。

4、互斥量同步程序

要使用互斥量來同步程序,兩個程序中的某個程序必須擁有同一互斥量物件的程序相關控制代碼。可以通過兩種方法獲得此控制代碼。一是在第二個執行緒建立互斥量時使用與第乙個互斥量一樣的lpname,此時就不再建立新的互斥量而是返回標識已有互斥量的程序相關控制代碼。另一種獲得的方法是使用

handle openmutex(

dword dwdesiredaccess, // mutex_all_access或synchronize(nt only)

bool binherithandle, // 指明此程序建立的任一子程序是否應該繼承此互斥量。

lpctstr lpname // 互斥量的名字

);呼叫openmutex時,系統將掃瞄所有現存的互斥量,如果找到lpname指定的互斥量。就返回給呼叫執行緒,如果找不到就返回null。

互斥量的使用《轉》

1 預備知識 臨界區非常適合同一程序中對資料的序列訪問,它的速度很快。然而,也許你想要使某些應用程式與機器中的其它事件或者其它程序取得同步,這時你就要使用一些核心物件來同步執行緒。核心物件包括 程序 執行緒 檔案 檔案變化通知 file change notification 控制台輸入 conso...

互斥量的使用《轉》

1 預備知識 臨界區非常適合同一程序中對資料的序列訪問,它的速度很快。然而,也許你想要使某些應用程式與機器中的其它事件或者其它程序取得同步,這時你就要使用一些核心物件來同步執行緒。核心物件包括 程序 執行緒 檔案 檔案變化通知 file change notification 控制台輸入 conso...

互斥量使用例項

4種排序公用乙個陣列 使用互斥量防止訪問衝突 cpp view plain copy include include include using namespace std const intn 12 static intarr 12 handle hmutex 互斥量控制代碼 intdata n ...