多執行緒簡易售票程式--孫鑫視訊示例

jsjliuyun發表於2014-05-16

孫鑫視訊多執行緒的第一個例子----簡易的售票程式

#include <Windows.h>
#include <iostream>

int ticket = 100;
//定義互斥物件
/*
互斥物件屬於核心物件,它能夠準確保證執行緒擁有對單個資源的互斥訪問
互斥物件包含一個使用數量 執行緒ID  計數器
ID用於標識系統中哪個執行緒當前擁有互斥物件,計數器用於指明該執行緒擁有互斥物件的次數
*/
HANDLE hMutex;
DWORD WINAPI FunProc_1(LPVOID lpParameter)
{
	while(true)
	{
		//設定hMutex為未通知狀態
		//請求互斥物件
		WaitForSingleObject(hMutex , INFINITE);
		if(ticket > 0)
		{
			Sleep(1);
			std::cout << "hThread1 ticket sell :" << ticket-- << std::endl;
		}else{
			break;
		}
		//釋放互斥物件,將互斥物件設定為通知物件
		ReleaseMutex(hMutex);
	}
	return 0;
}
DWORD WINAPI FunProc_2(LPVOID lpParameter)
{
	while(true)
	{
		//設定hMutex為未通知狀態
		//請求互斥物件
		WaitForSingleObject(hMutex , INFINITE);
		if(ticket > 0)
		{
			Sleep(1);
			std::cout << "hThread2 ticket sell :" << ticket-- << std::endl;
		}else{
			break;
		}
		//釋放互斥物件,將互斥物件設定為通知物件
		//當釋放的時候,系統會判斷當前執行緒ID和互斥物件hMutex內部的ID,相等才能釋放,不等則不能釋放
		//誰擁有互斥物件,誰才能去釋放互斥物件,這樣才能成功釋放
		//ReleaseMutex實際上遞減互斥物件的計數器
		ReleaseMutex(hMutex);
	}
	return 0;
}
int main()
{
	HANDLE hThread1 , hThread2;
	//建立執行緒
	hThread1 = CreateThread(NULL , 0 , FunProc_1 , NULL , 0 , NULL);
	hThread2 = CreateThread(NULL , 0 , FunProc_2 , NULL , 0 , NULL);
	//關閉控制程式碼並不是終止新建立執行緒,在主執行緒中關閉新建立執行緒的引用
	//核心物件引用計數器減1,當核心物件的引用計數器為0時釋放核心物件
	//類似於c++中的控制程式碼類中的引用計數
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	//建立/開啟互斥物件
	//TRUE呼叫該互斥物件獲得所有權,反之是不獲得
	//當為FALSE時也就是主執行緒不獲得hMutex的使用權
	//當為TRUE時,主執行緒擁有了互斥物件,而主執行緒並沒有釋放,其他兩個執行緒便得不到互斥物件的所有權
	hMutex = CreateMutex(NULL , FALSE , NULL);
	Sleep(1000);
	return 0;
}


相關文章