[Win32]臨界區
阿新 • • 發佈:2020-05-28
一、執行緒安全問題(不是全域性、只讀)
每個執行緒都是自己的棧,而區域性變數是儲存在棧中的,每個執行緒都有一份自己的區域性變數,如果執行緒僅僅使用區域性變數,全那麼就不存線上程安全的問題,全域性變數不是儲存在堆疊中,而存在於全域性區這意味著兩個執行緒執行的程式碼如果訪問的是全域性變數,那就用的將是同一份全域性變數,如果全是讀不更改情況也不存線上程安全問題。
// my6.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" #include "stdlib.h" int g_dwTickets = 10; DWORD WINAPI MyFirstThreadPoc(LPVOID lpParameter){ while (g_dwTickets > 0) { printf("還有多少票%d \n",g_dwTickets); g_dwTickets--; printf("賣出一張還有%d \n",g_dwTickets); } return 0; } int main(int argc,char* argv[]) { DWORD dwResult1; DWORD dwResult2; HANDLE aThreadHandles[2];//建立執行緒 aThreadHandles[0] = CreateThread(NULL,MyFirstThreadPoc,NULL,NULL);
//建立新的執行緒 aThreadHandles[1] = CreateThread(NULL,NULL); //等執行緒結束 WaitForMultipleObjects(2,aThreadHandles,true,INFINITE); //執行緒執行完了 GetExitCodeThread(aThreadHandles[0],&dwResult1); GetExitCodeThread(aThreadHandles[1],&dwResult2); printf("%d %d",dwResult1,dwResult2); system("pause"); return 0; }
二、解決執行緒安全問題
臨界資源:一次只允許一個執行緒使用的資源叫做臨界資源
臨界區:訪問臨界資源的程式是臨界區
三、臨界區實現執行緒鎖
<1>建立全域性變數 CRITICAL_SECTION cs;
<2>初始化全域性變數 lnitializeCriticalSection(&cs);
<3>實現臨界區
EnterCriticalSection(&cs); //構建臨界區
LeaveCriticalSection(&cs); //離開臨界區