c++ - Qt线程设计生产者消费者

标签 c++ multithreading qt

主线程正在将任务加载到队列中。 工作线程正在处理这些任务。

我的代码是这样的:

//Core subclass a QThread
Core::AddTask()
{ ...
  mutex.lock();
  tasks.append(task);
  mutex.unlock();
  start();//which calls the run function
}

Core::RefreshTask()
{ ...
  mutex.lock();
  tasks.clear();
  mutex.unlock();
  // Calculate the new tasks...
  ...
  //foreach newly added task call
  AddTask();
}

Core::run()
{ ...
  while (1)
{
  finish = false;
  mutex.lock();
  tasks.dequeue();
  if (tasks.size() == 0)
    finish = true;
  mutex.unlock();
  ...
  if (finish)
     break;
}
}

但是我发现工作线程未能完成所有任务,因为当运行函数正在处理时,它不会响应 start() 调用。 然后在这种情况下:run 函数正在处理最后一个任务,同时调用 AddTask,那么它的 start() 调用将不执行任何操作。然后 run() 函数完成并忽略任务。

我知道信号/槽机制可以解决这个问题。但我被迫使用旧的 QThread::run() 风格的多线程...... 关于如何在 Qt 中正确编写生产者消费者模式有什么建议吗?

最佳答案

我认为您不需要在 Core::AddTask() 中调用 start()。当您将新任务添加到任务列表时,您可以发送某种事件消息。它可以是 Qt 信号、条件变量或其他东西。

事件循环在单独的线程和进程任务中工作。如果任务列表为空,则事件循环等待事件。

关于c++ - Qt线程设计生产者消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671960/

相关文章:

C++-从值中添加或减去 '0'

c++ - 从 QTreeView 中的 QModelIndex 获取平行索引

c++ 无法改进文件读取?

c++ - qt 在 Windows 线程中发出信号

sql - 如何处理具有多个批量插入的表的主键?

multithreading - 如何卡住 Rc 数据结构并跨线程发送它

c++ - 动态包含类文件

linux - Qt 虚拟键盘,用于在 Linux 主机上运行的 Qt 应用程序

Qt QGraphicsScene 和 QAbstractItemModel

c++ - 编写函数指针比调用函数指针好在哪里?