C++ 在某些情况下,使用队列中的元素进行阻塞处理
我有一个线程推送到队列,还有一个线程使用队列中的元素。 其中一个元素的处理是异步的,但我不想在处理这个元素的过程中处理其他元素。 (假设输出流和队列是线程安全的) 我想知道什么是最好的方式来实现消费线程。。。我认为虽然(真实)和条件不是最好的选择 这是一个简单的实现(C++ 在某些情况下,使用队列中的元素进行阻塞处理,c++,multithreading,asynchronous,queue,c++14,C++,Multithreading,Asynchronous,Queue,C++14,我有一个线程推送到队列,还有一个线程使用队列中的元素。 其中一个元素的处理是异步的,但我不想在处理这个元素的过程中处理其他元素。 (假设输出流和队列是线程安全的) 我想知道什么是最好的方式来实现消费线程。。。我认为虽然(真实)和条件不是最好的选择 这是一个简单的实现(process2必须是同步的) #包括 #包括 #包括 #包括 #包括 std::原子布尔isprocessing{false}; void进程0() { 标准::cout 我想知道实现消费线程的最佳方式是什么…我想 虽然(正确)和
process2
必须是同步的)
#包括
#包括
#包括
#包括
#包括
std::原子布尔isprocessing{false};
void进程0()
{
标准::cout
我想知道实现消费线程的最佳方式是什么…我想
虽然(正确)和条件不是最佳选择
你在这里的想法是合理的:使用像这样的while循环(即不涉及任何等待)的最大问题是你在浪费CPU时间和精力。你的辅助线程(以及给定主线程的代码)在一段时间内,无明显原因地将CPU核心保持为自己所有,这样其他任务就无法为自己获得CPU时间
最简单的改变方式是添加如下内容:
std::thread consumingThread([&q]() {
while (true) {
if (!q.empty() && !isProcess2Processing) {
consume(q.front());
q.pop();
}
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
});
在这里,您将睡眠5毫秒,在此期间,调度程序将能够让其他任务完成其工作
另外,您应该确保每个循环都有退出条件,并且在离开main()
之前调用consumingThread.join();
,只需在consumingThread
中运行process2
(无需创建新线程)。其他任何程序都不能同时运行。不,process2必须是异步的-我不能更改它。我的代码只是一个演示。我必须在process2
中使用异步调用。您可以随时等待。您对process2
有什么控制权?您能让它返回一个未来的
,然后调用方可以等待吗?或者通知最后是条件变量?
std::thread consumingThread([&q]() {
while (true) {
if (!q.empty() && !isProcess2Processing) {
consume(q.front());
q.pop();
}
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
});