我正在使用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 WaitForMultipleObject,但找不到适用于这种情况的替代方案。
谢谢
我见过这个相关的问题,但它并没有真正回答问题。linux上的学习线程
如果我正确理解你的问题,我可能会这样做:
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
是一个全局变量,类似于条件
和myQueue
(我建议不要使用队列
作为变量名,因为它也是标准容器适配器的名称)。控制线程可以将Stop
设置为true
(同时持有对互斥锁
的锁)并在条件
上调用通知一个()
或通知所有()
。
这样,当一个新项目被推入队列时,以及当发出停止信号时,都会调用条件变量上的notify***()
,这意味着在等待该条件变量后醒来的线程必须检查它被唤醒的原因,并相应地采取行动。
我有一个注册了ActionListener的JTextField。当这个JTextField有焦点时,按下enter键,就会创建一个ActionEvent。 如何将此事件链接到另一个组件ActionListener(如JButton),以便运行其代码?
我试着用Java画一个长方形。我设置框架大小(800400)和可调整大小(假)矩形的x=50,y=50宽度=700高度=300。为什么不在中间呢?非常感谢。
有人能告诉我这个错误是什么意思,这样我就可以避免它了吗?在此处输入图像描述
谁能告诉我从.p12文件中提取/转换证书.crt文件的正确方法/命令吗?在我搜查之后。我找到了将.pem转换为.crt的方法。但未找到.p12到.crt。
最近我在做反平工作人员的功能。我的代码是: 但今天我注意到,如果我在#公告中ping@Everyone,它会注意到我ping了staff。那么,如何才能为特定渠道破例呢?我必须在这段代码中添加什么?
我使用的是在windows7中运行的PHP和MySQL。我需要在每天预定的时间运行PHP脚本来发送生日祝福短信。