c++ - 当应用程序应该退出时,生产者和消费者无限期地等待

标签 c++ multithreading qt qt4

我已经使用 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 对象。上面的实现工作正常,但是当主程序必须终止时就会出现问题,因为一些消费者或生产者正在无限期地等待,特别是:

  1. 如果队列为空且消费者调用了dequeue() 函数,则该消费者将无限期等待。
  2. 如果队列已满并且生产者调用了 enqueue() 函数,则该生产者将无限期等待。

我该如何解决这个问题?

最佳答案

我认为处理终止的最简单方法是使用原子标志(您可以使用 std::atomic_boolQAtomicInt )并让 _consumer.wait 使用超时。

当你detect a timeout (如果发生超时,wait 返回 false)检查标志,如果 cancel==true 则退出,否则再次等待。因此,在最坏的情况下,他们将等待 time 毫秒,然后退出。

关于c++ - 当应用程序应该退出时,生产者和消费者无限期地等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24742126/

相关文章:

c++ - 如何判断cudaErrorIllegalAddress是由于目标地址还是源地址?

multithreading - 单独 TThread block GUI 线程中的操作

qt - 如何禁用 QTextEdit 中的快捷方式

c++ - 无法构建多部件 QtDesigner 插件

c++ - 将多维数组传递给函数(C++)?

c++ - 如何创建一个类来包装 GLUT?

c++ - 睡了一个确切的时间

java - testng 中的并行方法执行仅执行从类中调用的最后一个方法

c++ - Qt - 滚动图表的可见区域

java - JNI/安卓 : call to non static method in Java from C++?