QMutex
개체, 생성자 스레드의 경우 QWaitCondition
개체 및 소비자 스레드의 경우 QWaitCondition
개체를 사용하여 스레드 안전 차단 대기열을 구현했습니다. 다음과 같이 기능 enqueue()
및 dequeue()
가 표시됩니다 :이 공유 큐가 MyQueue
객체에 대한 참조를 사용하는 생성자를 가지고 접근 할 필요가응용 프로그램을 종료 할 때 무기한으로 기다리는 제작자와 소비자
void MyQueue::enqueue(const QString& s)
{
_mutex.lock();
while (_queue.size() == _maxSize) { _producer.wait(&_mutex); }
_queue.enqueue(s);
_consumer.wakeAll();
_mutex.unlock();
}
QString MyQueue::dequeue()
{
QString s;
_mutex.lock();
while (_queue.empty()) { _consumer.wait(&_mutex); }
s = _queue.dequeue();
_producer.wakeAll();
_mutex.unlock();
return s;
}
소비자 및 생산자 스레드. 이 소비자 큐가 비어 있고 소비자가 dequeue()
기능을 호출 한
- 경우 : 위의 구현은 제대로 작동하지만 메인 프로그램이 종료해야하는 경우 일부 소비자 또는 생산자 특히, 무기한 대기하고 있기 때문에 문제가 발생 무기한으로 기다릴 것이다.
- 대기열이 가득 차서 생산자가
enqueue()
함수를 호출 한 경우이 생성자는 무기한 대기합니다.
어떻게하면이 문제를 해결할 수 있습니까?
셧다운을 나타내는 상태가 있고 소비자 또는 생산자를 깨운 후 읽습니다. 대기열이 비어 있고 모든 소비자가 멈출 때까지 모든 생산자가 모든 소비자를 깨우지 못하게합니다. –