Windows線程同步【2】臨界區

臨界區是線程同步的一種實現方式。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);
}
相關文章
相關標籤/搜索