我已经使用 QMutex
对象、用于生产者线程的 QWaitCondition
对象和用于消费者线程。 enqueue()
和dequeue()
函数如下所示:
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;
}
需要访问此共享队列的消费者和生产者线程有一个构造函数,该构造函数引用了一个MyQueue
对象。上面的实现工作正常,但是当主程序必须终止时就会出现问题,因为一些消费者或生产者正在无限期地等待,特别是:
- 如果队列为空且消费者调用了
dequeue()
函数,则该消费者将无限期等待。 - 如果队列已满并且生产者调用了
enqueue()
函数,则该生产者将无限期等待。
我该如何解决这个问题?
最佳答案
我认为处理终止的最简单方法是使用原子标志(您可以使用 std::atomic_bool 或 QAtomicInt )并让 _consumer.wait
使用超时。
当你detect a timeout (如果发生超时,wait
返回 false
)检查标志,如果 cancel==true
则退出,否则再次等待。因此,在最坏的情况下,他们将等待 time
毫秒,然后退出。
关于c++ - 当应用程序应该退出时,生产者和消费者无限期地等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24742126/