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

015 臨界區

導數據 nba cnblogs clas invalid turn 隨機 引導 money

  ● EnterCriticalSection()

    ○ 多個線程操作相同的數據時,一般是需要按順序訪問的,否則會引導數據錯亂,無法控制數據,
      變成隨機變量。為解決這個問題,就需要引入互斥變量,讓每個線程都按順序地訪問變量。
      這樣就需要使用EnterCriticalSection和LeaveCriticalSection函數。

    WINBASEAPI
    VOID
    WINAPI
  EnterCriticalSection(
  __inout LPCRITICAL_SECTION lpCriticalSection
  );
  是多線程中用來確保同一時刻只有一個線程操作被保護的數據的操作函數,相關的多線程數據操作函數還有:

InitializeCriticalSection(&cs);//初始化臨界區
EnterCriticalSection(&cs);//進入臨界區
//操作數據
MyMoney*=10;//所有訪問MyMoney變量的程序都需要這樣寫Enter.. Leave...
LeaveCriticalSection(&cs);//離開臨界區
DeleteCriticalSection(&cs);//刪除臨界區

 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 }

技術分享

015 臨界區