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;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章