코가손의 블로그

[네트워크/C++] Lock을 얻기 위한 대기방법(3) Condition Variable 본문

GameDev/NetworkProgramming

[네트워크/C++] Lock을 얻기 위한 대기방법(3) Condition Variable

Cogason 2022. 1. 3. 21:27

Condition Variable은 조건을 확인하여 Lock을 잡을지의 여부를 결정한다.

Event는 커널 오브젝트

condition_variable은 유저 오브젝트라는 차이가 있다.

C++11의 표준이니 왠만하면 Event방식보단 condition_variable방식을 사용하는 것이 좋다.

 

condition_variable을 사용하는 전형적인 단계를 보자면 이렇다.

<Producer>

1) Lock을 잡는다.

2) 공유 변수 값을 수정한다.

3) Lock을 푼다.

4) 조건변수를 통해 다른 쓰레드에게 통지한다.

<Consumer>

1) Lock을 잡고

2) 조건 확인, 만족한다면 빠져 나와서 이어서 코드를 진행한다. 아니라면 Lock을 풀어주고 대기상태로 전환한다.

 

mutex m;
queue<int> q;

condition_variable cv;

void Producer()
{
    while (true)
    {
        {
            unique_lock<mute> lock(m);
            q.push_back(100);
        }
        
        cv.notify_one();
    }
}

void Consumer()
{
    while (true)
    {
        unique_lock<mute> lock(m);
        cv.wait(lock, []() { return q.empty() == false });
        
        int data = q.front();
        q.pop();
        cout << data << endl;
    }
}

int main()
{
    thread t1(Producer);
    thread t2(Consumer);
    
    t1.join();
    t2.join();
    
    return 0;
}

 

cv.notify_one() -> wait중인 쓰레드가 있으면 1개만 깨운다

cv.notify_all() -> wait중인 쓰레드 전부를 깨운다

 

Comments