코가손의 블로그
[네트워크/C++] Lock을 얻기 위한 대기방법(3) Condition Variable 본문
GameDev/NetworkProgramming
[네트워크/C++] Lock을 얻기 위한 대기방법(3) Condition Variable
Cogason 2022. 1. 3. 21:27Condition 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중인 쓰레드 전부를 깨운다
'GameDev > NetworkProgramming' 카테고리의 다른 글
[네트워크/C++] Lock을 얻기 위한 대기방법(2) Event (0) | 2022.01.03 |
---|---|
[네트워크/C++] Lock을 얻기 위한 대기방법(1) SpinLock (0) | 2021.12.29 |
[네트워크/C++] 네트워크 프로토콜, TCP (0) | 2021.12.20 |
Comments