将项目添加到队列时运行线程 我在VS2017中开发了一个C++的Windows应用程序 我必须在线程中执行一些数据(存储在队列中)处理,但仅当队列中存在项时 thread { if(!queue.empty() { //process data and pop out } }
但队列可能是空的,有时有数据,所以我怎么能做到这一点呢 我试图在线程中运行整个循环,但这并不有效,经过优化的ad应用程序在一段时间后变得没有响应将项目添加到队列时运行线程 我在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的东西。它将允许您的工作线程在无事可
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循环中使用此条件变量:)