1. 程式人生 > >windows程式設計學習——互斥物件

windows程式設計學習——互斥物件

對於互斥物件的操作包括:
(1)建立互斥物件(CreateMutex)
CreateMutex函式
功能: 建立互斥量來確保一個執行緒獨佔對一個資源的訪問。互斥量物件包含一個使用計數、執行緒ID
以及一個遞迴計數。執行緒ID用來標識當前佔用這個互斥量的是系統中的那個執行緒,遞迴計數
表示這個執行緒佔用該互斥量的次數。互斥量可以確保正在訪問記憶體塊中的任何執行緒會獨佔對
記憶體塊的訪問權,這樣就維護了資料的完整性。
原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes,// 指向安全屬性的指標
BOOL bInitialOwner,// 初始化互斥物件的所有者
LPCTSTR lpName // 指向互斥物件名的指標
);
引數:
bInitialOwner:用來控制互斥量的初始狀態,如果傳的是FALSE(通常情況),那麼互斥量物件的執行緒ID和遞迴計數都將被設定為0,這意味著互斥量不為任何執行緒佔用,因此處於觸發狀態。如果傳入的是TRUE,那麼物件的執行緒ID將被設為呼叫執行緒的執行緒ID,遞迴計數將被設為1,由於執行緒ID為非0值,因此互斥量處於未觸發狀態。
 

備註:

假設執行緒試圖等待一個未觸發的互斥量物件。在這種情況下,執行緒通常會進入等待狀態。但是,執行緒會檢查想要的互斥量的執行緒ID與互斥量內部記錄的執行緒ID是否相同。如果一致,那麼執行緒將保持可排程狀態--即使該互斥量沒被觸發。每次執行緒成功等待了一個互斥量,互斥量物件的遞迴計數會遞增。使遞迴計數大於1的唯一途徑就是利用這個例外。


(2)開啟互斥物件(OpenMutex)
     OpenMutex函式
功能:開啟一個互斥量物件
函式原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess,// 開啟方式
BOOL bInheritHandle,// 如希望子程序能夠繼承控制代碼,則為TRUE

LPCTSTRlpName// 指向互斥物件名的指標

);


引數:
dwDesiredAccess取值如下:
MUTEX_ALL_ACCESS請求對互斥體的完全訪問
MUTEX_MODIFY_STATE允許使用 ReleaseMutex 函式
SYNCHRONIZE 允許互斥體物件同步使用


(3)釋放互斥物件(ReleaseMutex)
   ReleaseMutex函式
功能:釋放互斥量
原型:
HANDLE ReleaseMutex(
HANDLE hMutex
)
備註:這個函式會將物件的遞迴計數減1,。如果執行緒成功的等待了互斥量物件不止一次,那麼執行緒

必須呼叫該函式相同次數,才能將遞迴計數變成0.

下面是互斥物件實際應用的例項:

1)對CreateMutex函式的使用
#include <Windows.h>
#include <stdio.h>
#define MUTEXNUME	"test"								//互斥物件的名字
int main()
{
	HANDLE hMutex = NULL;
	hMutex = CreateMutex(NULL,FALSE,MUTEXNUME);			//建立一個命名互斥物件
	while (1)
	{
		WaitForSingleObject(hMutex,INFINITE);			//等待互斥量被觸發,等待到後,把執行緒ID設定為被呼叫執行緒的執行緒ID,將遞迴計數設定為1,互斥量變成未觸發狀態
		printf("123456789\n");
		ReleaseMutex(hMutex);							//釋放互斥量,將遞迴計數設定為0,互斥量被觸發,呼叫等待的其他執行緒
		Sleep(100);
	}
	getchar();
	return 0;
}
2)對OpenMutex函式的使用
#include <Windows.h>
#include <stdio.h>
#define MUTEXNUME	"test"										//互斥物件的名字
int main()
{
	HANDLE hMutex = NULL;
	hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,MUTEXNUME);		//開啟核心物件中,名字為test的互斥核心物件
	while (1)
	{
		WaitForSingleObject(hMutex,INFINITE);			//等待互斥量被觸發,等待到後,把執行緒ID設定為被呼叫執行緒的執行緒ID,將遞迴計數設定為1,互斥量變成未觸發狀態
		printf("987654321\n");
		ReleaseMutex(hMutex);					//釋放互斥量,將遞迴計數設定為0,互斥量被觸發,呼叫等待的其他執行緒
		Sleep(100);
	}
	getchar();
	return 0;
}