Qt线程设计生产者消费者

时间:2015-04-16 10:26:57

标签: 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;
}
}

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

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

1 个答案:

答案 0 :(得分:2)

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

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