我正在使用C ++ 11和stl线程编写线程安全队列。 WaitAndPop方法目前如下所示。我希望能够将一些东西传递给WaitAndPop,以指示调用线程是否已被要求停止。如果等待并返回队列的一个元素,WaitAndPop应该返回true,如果调用的线程被停止,它应该返回false。
bool WaitAndPop(T& value, std::condition_variable callingThreadStopRequested)
{
std::unique_lock<std::mutex> lock(mutex);
while( queuedTasks.empty() )
{
queuedTasksCondition.wait(lock);
}
value = queue.front();
queue.pop_front();
return true;
}
是否可以编写类似这样的代码?我已经习惯了Win32 WaitForMultipleObjects,但找不到适合这种情况的替代方案。
感谢。
我已经看到了这个相关的问题,但它并没有真正回答这个问题。 learning threads on linux
答案 0 :(得分:8)
如果我理解你的问题,我可能会做这样的事情:
bool WaitAndPop(T& value)
{
std::unique_lock<std::mutex> lk(mutex);
// Wait until the queue won't be empty OR stop is signaled
condition.wait(lk, [&] ()
{
return (stop || !(myQueue.empty()));
});
// Stop was signaled, let's return false
if (stop) { return false; }
// An item was pushed into the queue, let's pop it and return true
value = myQueue.front();
myQueue.pop_front();
return true;
}
此处stop
是一个全局变量,如condition
和myQueue
(我建议不要将queue
用作变量名称,因为它也是一个变量名称标准容器适配器)。控制线程可以将stop
设置为true
(同时锁定mutex
)并在notifyOne()
上调用notifyAll()
或condition
。
这样,当一个新项目被推入队列时,两者调用条件变量notify***()
,当stop
信号时正在被提升,这意味着在等待该条件变量后醒来的线程必须检查它被唤醒的原因并采取相应的行动。