一:介紹
臨界區指的是一個訪問共用資源(例:全域性變數)的程式片段,該共用資源無法同時被多個執行緒訪問的特性。有多個執行緒試圖同時訪問臨界區,那麼在有一個執行緒進入後其他所有試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入臨界區的執行緒離開。臨界區在被釋放後,其他執行緒可以繼續搶佔,並以此達到用原子方式操作共享資源的目的。
臨界區在使用時以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: woniu201 5 Email: wangpengfei.201@163.com 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 }
掃碼關注公眾號
專注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分散式,高併發,設計模式,爬蟲,docker,shell程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。