1. 程式人生 > >06 臨界區

06 臨界區

1 執行緒安全問題
每個執行緒都有自己的棧,而區域性變數是在棧中的,這就意味著每個執行緒都有一份自己的區域性變數, 如果執行緒只使用區域性變數,那就不存線上程安全問題;如果多執行緒訪問全域性變數,則存在安全問題;
2.臨界資源
一次只允許一個執行緒使用的資源我們將它叫做臨界資源;
3.臨界區
訪問臨界資源的那段程式我們稱為臨界區;
4.簡單的臨界區使用示例

/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

INT g_dwTickets = 10;
CRITICAL_SECTION cs;

//執行緒處理函式,引數與返回值不是必須的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	if (g_dwTickets > 0){
		//進入臨界區
		EnterCriticalSection(&cs);
		while (g_dwTickets > 0){
			printf("還有:%d張票\n", g_dwTickets);
			g_dwTickets--;
			printf("賣出一張,還有:%d張\n", g_dwTickets);
		}
		//離開臨界區
		LeaveCriticalSection(&cs);
	}
	return 0;
}

int main()
{
	HANDLE hThreadArr[2];
	INT n = 10;
	
	//初始化臨界區
	InitializeCriticalSection(&cs);
	hThreadArr[0] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	hThreadArr[1] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	//等待多個物件,第一個引數為個數,第二個為控制代碼陣列,狀態標誌等
	//待一個還是所有,最後一個引數為超時時間
	WaitForMultipleObjects(2, hThreadArr, TRUE, INFINITE);
	
	CloseHandle(hThreadArr[0]);
	CloseHandle(hThreadArr[1]);
	getchar();
	return 0;
}