臨界區是線程同步的一種實現方式。Windows提供了4個關於臨界區的函數(InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,DeleteCriticalSection),要想使用這些函數,必須先有一個臨界區變量,ios
CRITICAL_SECTION cs;
臨界區變量,不能複製,不能移動,也不能讀取裏面的字段(能夠取臨界區變量的地址)。總而言之,咱們在編寫程序時,必須把臨界區變量當成一個黑箱,一切對臨界區的操做必須經過那4個函數來進行。windows
在使用臨界區以前,必須用InitializeCriticalSection函數將其初始化:
函數
InitializeCriticalSection(&cs);
一個線程能夠經過EnterCriticalSection函數來進入一個臨界區:spa
EnterCriticalSection(&cs);
一旦一個線程進入了某個臨界區,其餘線程便不能進入這個臨界區。
線程
一個線程能夠經過LeaveCriticalSection函數來離開一個臨界區:code
LeaveCriticalSection(&cs);
當一個線程離開一個臨界區以後,其餘線程能夠進入這個臨界區。orm
當程序再也不須要這個臨界區時,別忘記將其銷燬。
同步
DeleteCriticalSection(&cs);
用法與示例:it
臨界區的用法是,若是一個變量(記爲x)須要被多個線程共享時,那麼能夠搞一個臨界區。任何一個線程在訪問x以前,必須先進入臨界區,完成對x的訪問後,離開臨界區。由於一個臨界區在同一時刻只容許一個線程進入,這樣就保證了x在同一時刻只能被一個線程訪問。io
在下面的示例中,n是受臨界區保護的變量。
#include <iostream> #include <windows.h> CRITICAL_SECTION cs; int n = 0; DWORD Thread1(void *) { // 其餘代碼 EnterCriticalSection(&cs); ++n; LeaveCriticalSection(&cs); // 其餘代碼 } DWORD Thread2(void *) { // 其餘代碼 EnterCriticalSection(&cs); n = 5; LeaveCriticalSection(&cs); // 其餘代碼 } void main() { InitializeCriticalSection(&cs); Sleep(5000); DeleteCriticalSection(&cs); }