gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:28:36 24 4
gpt4 key购买 nike

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

我的代码是这样的:

//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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com