線程同步(windows平臺):臨界區
阿新 • • 發佈:2018-10-23
create volatil 代碼 call clas 離開 eat using 創建
一:介紹
臨界區指的是一個訪問共用資源(例:全局變量)的程序片段,該共用資源無法同時被多個線程訪問的特性。有多個線程試圖同時訪問臨界區,那麽在有一個線程進入後其他所有試圖訪問此臨界區的線程將被掛起,並一直持續到進入臨界區的線程離開。臨界區在被釋放後,其他線程可以繼續搶占,並以此達到用原子方式操作共享資源的目的。
臨界區在使用時以CRITICAL_SECTION結構對象保護共享資源,並分別用EnterCriticalSection()和LeaveCriticalSection()函數去標識和釋放一個臨界區。所用到的CRITICAL_SECTION結構對象必須經過InitializeCriticalSection()的初始化後才能使用,而且必須確保所有線程中的任何試圖訪問此共享資源的代碼都處在此臨界區的保護之下。否則臨界區將不會起到應有的作用,共享資源依然有被破壞的可能。
二:步驟
- 創建臨界區對象:CRITICAL_SECTION critical
- 初始化臨界區:InitializeCriticalSection(&critical)
- 進入臨界區:EnterCriticalSection(&critical)
- 釋放臨界區:LeaveCriticalSection(&critical)
三:代碼實現
1 /******************************************************** 2 Copyright (C), 2016-2018, 3 FileName: t12 4 Author: woniu2015 Email: [email protected] 6 Created: 2018/10/23 7 Description: 線程同步-臨界區 8 ********************************************************/ 9 #include <iostream> 10 #include <Windows.h> 11 using namespace std; 12 13 volatile int number = 1; 14 CRITICAL_SECTION critical; //臨界區句柄 15 16 DWORD CALLBACK ThreadFun1(LPVOID pParam) 17 { 18 while (1) 19 { 20 EnterCriticalSection(&critical); 21 cout << "Thread1:" << number++ << endl; 22 if (number >= 1000) 23 { 24 break; 25 } 26 LeaveCriticalSection(&critical); 27 } 28 29 return 0; 30 } 31 32 DWORD CALLBACK ThreadFun2(LPVOID pParam) 33 { 34 while (1) 35 { 36 EnterCriticalSection(&critical); 37 cout << "Thread2:" << number++ << endl; 38 LeaveCriticalSection(&critical); 39 if (number >= 1000) 40 { 41 break; 42 } 43 } 44 return 0; 45 } 46 47 48 int main() 49 { 50 InitializeCriticalSection(&critical); 51 CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL); 52 CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL); 53 54 getchar(); 55 return 1; 56 }
線程同步(windows平臺):臨界區