● EnterCriticalSection()windows
○ 多個線程操做相同的數據時,通常是須要按順序訪問的,不然會引導數據錯亂,沒法控制數據,
變成隨機變量。爲解決這個問題,就須要引入互斥變量,讓每一個線程都按順序地訪問變量。
這樣就須要使用EnterCriticalSection和LeaveCriticalSection函數。多線程
WINBASEAPI
VOID
WINAPI
EnterCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection
);
是多線程中用來確保同一時刻只有一個線程操做被保護的數據的操做函數,相關的多線程數據操做函數還有:函數
InitializeCriticalSection(&cs);//初始化臨界區
EnterCriticalSection(&cs);//進入臨界區
//操做數據
MyMoney*=10;//全部訪問MyMoney變量的程序都須要這樣寫Enter.. Leave...
LeaveCriticalSection(&cs);//離開臨界區
DeleteCriticalSection(&cs);//刪除臨界區oop
1 #define UNICODE 2 #include <stdio.h> 3 #include <process.h> 4 #include <windows.h> 5 6 volatile int gNum; 7 volatile int gLoopCount = 100; 8 CRITICAL_SECTION gCs; //臨界區 -> 關鍵段 9 unsigned __stdcall ThreadFunc(void* lParam) 10 { 11 static int nThreadIndex = 0; //靜態變量 12 nThreadIndex++; 13 EnterCriticalSection(&gCs); //進去臨界區 14 gNum = 0; 15 for(int i = 0; i < gLoopCount; ++i) 16 { 17 gNum += i; 18 } 19 printf("Thread%d:%d\r\n",nThreadIndex,gNum); 20 LeaveCriticalSection(&gCs); 21 return 0; 22 } 23 24 int main() 25 { 26 const int MAXTHREADCOUNT = 10; 27 HANDLE hThreads[MAXTHREADCOUNT] = { INVALID_HANDLE_VALUE }; 28 InitializeCriticalSection(&gCs); //分配一些內存 29 InitializeCriticalSectionAndSpinCount(&gCs,1); //以旋轉鎖的方式使用臨界區 30 for(int i = 0; i<MAXTHREADCOUNT; ++i) 31 { 32 hThreads[i] = (HANDLE)_beginthreadex(nullptr,0,ThreadFunc,nullptr,0,nullptr); 33 } 34 WaitForMultipleObjects(MAXTHREADCOUNT, hThreads, TRUE, INFINITE); 35 for( int i = 0; i<MAXTHREADCOUNT; ++i) 36 { 37 CloseHandle(hThreads[i]); 38 } 39 DeleteCriticalSection(&gCs); 40 return 0; 41 }