Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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
将项目添加到队列时运行线程 我在VS2017中开发了一个C++的Windows应用程序 我必须在线程中执行一些数据(存储在队列中)处理,但仅当队列中存在项时 thread { if(!queue.empty() { //process data and pop out } }_C++_Windows_Multithreading_Queue - Fatal编程技术网

将项目添加到队列时运行线程 我在VS2017中开发了一个C++的Windows应用程序 我必须在线程中执行一些数据(存储在队列中)处理,但仅当队列中存在项时 thread { if(!queue.empty() { //process data and pop out } }

将项目添加到队列时运行线程 我在VS2017中开发了一个C++的Windows应用程序 我必须在线程中执行一些数据(存储在队列中)处理,但仅当队列中存在项时 thread { if(!queue.empty() { //process data and pop out } },c++,windows,multithreading,queue,C++,Windows,Multithreading,Queue,但队列可能是空的,有时有数据,所以我怎么能做到这一点呢 我试图在线程中运行整个循环,但这并不有效,经过优化的ad应用程序在一段时间后变得没有响应 thread { while(true) { if(!queue.empty() { //process data and pop out } } } 请支持并帮助我们了解如何有效地做到这一点?您所寻求的是一种称为a的东西。它将允许您的工作线程在无事可

但队列可能是空的,有时有数据,所以我怎么能做到这一点呢

我试图在线程中运行整个循环,但这并不有效,经过优化的ad应用程序在一段时间后变得没有响应

 thread
{
    while(true)
    {
        if(!queue.empty()
        {
            //process data and pop out 
        }
    }
}

请支持并帮助我们了解如何有效地做到这一点?

您所寻求的是一种称为a的东西。它将允许您的工作线程在无事可做时暂停,然后在另一个线程向队列中插入内容时立即恢复(并通知您的条件变量取消阻止)


示例和比我能写的任何东西都好。

来自@selbie的回答帮助我做到了这一点,如下所示

thread
{
    while(true)
    {
        if(condition_varibale not TURE wait here)

        if(!queue.empty()
        {
            //process data and pop out 
        }
    }
}

< >在添加项到队列时更新条件变量。< /p>这不是有效的C++…我只写了通用代码,而不是实际C++。但实际上我使用的是C++你应该发布实际的可编译代码。人们将更倾向于帮助,而不太倾向于否决。从队列中添加和删除元素的可能重复操作是受互斥保护的操作。如果在添加新元素之前队列为空,则会启动一个新线程。线程进行检查,但不删除队列中的第一个元素,然后对其执行需要执行的操作。线程在处理完该元素后将其从队列中移除(受互斥保护的操作),如果队列现在为空,线程将终止,否则线程将处理队列中的下一个元素。如果您还有任何问题,。感谢您在线程的while循环中使用此条件变量:)