Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在某些情况下,使用队列中的元素进行阻塞处理_C++_Multithreading_Asynchronous_Queue_C++14 - Fatal编程技术网

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));
    }
});