해결된 질문
작성
·
146
1
mutex m;
queue<int32> q;
condition_variable cv;
void Producer()
{
while (true)
{
{
unique_lock<mutex> lock(m);
q.push(100);
}
cv.notify_one();
//cout << q.size() << endl;
//this_thread::sleep_for(0.001ms);
}
}
void Consumer()
{
while (true)
{
unique_lock<mutex> lock(m);
cv.wait(lock, []() {return q.empty() == false; });
int32 data = q.front();
q.pop();
cout << q.size() << endl;
}
}
답변 1
0
1 01 0 은 아니구요
cv.notify_one()을 한 다음에 친절히 상대방에 꺼내가는 것을 기다리진 않기에
절묘하게 다음 while(true) 루프에서 또 lock을 먼저 획득하면
연이어서 숫자가 늘어날 수 있습니다.
멀티쓰레드 환경은 공유자원을 차지하려고 격렬히 경합을 하는 것이죠.
그렇다면 매번 데이터를 produce 하는 쪽만 승리하면 어쩌지? 싶겠지만
이렇게 while (true)로 데이터를 밀어넣는 경우는 현실상에 없어 큰 문제 없습니다.