이 코드는 생산자의 void push(data)
내부 뮤텍스에서 대기 할 것인가?이 부스트 조건 코드 사용에 문제가 있습니까?
그렇다면 어떻게 해결할 수 있습니까?
boost::mutex access;
boost::condition cond;
// consumer
data read()
{
boost::mutex::scoped_lock lock(access);
// this blocks until the data is ready
cond.wait(lock);
// queue is ready
return data_from_queue();
}
// producer
void push(data)
{
//<--- will a block ever happen here?
boost::mutex::scoped_lock lock(access);
// add data to queue
cond.notify_one();
}
((;;) 루프에 대한 스레드 풀이 있고이 풀의 스레드에서 read() 호출이 있다고 가정 해 봅시다. 그런 다음 데이터를 처리합니다. 그리고 push()를 외부 스레드로 호출합니다. 내 질문은, 그 외부 스레드도 (데이터) 푸시에 대한 호출에 차단할 수 있습니까?
사실이 아닙니다. void 푸시 (데이터)는 대기가 호출 될 때까지 차단되지 않습니다. 뮤텍스를 얻을 수없는 경우에만 차단되며, 다른 누군가가 뮤텍스를 해제 할 때까지 기다려야합니다. 데이터 read() 함수는 실제로 대기열에 항목이 있는지 확인해야합니다 (대기 (wait)를 호출하지 않았거나 가짜 깨우기가 발생했을 때 항목이 추가되었을 수 있습니다). 함수는 "while (queue is empty) cond.wait (lock); return data_from_queue();"를 수행해야합니다. – nos