以下流程函数从队列中读取数据并对其进行处理。 $files = mysql_query("SELECT * FROM files
WHERE unpublish=0
and year(date)=(SELECT MAX(YEAR(date) FROM files)
ORDER BY files.date DESC");
的{{1}}功能会执行阻止呼叫。因此,在队列中存在可读取的数据之前,控制不会继续前进。
wait_and_pop
status是一个布尔值(在全局范围内)。默认情况下,此布尔值设置为true。只有在捕获信号时才会将其更改为false,例如SIGINT,SIGSESV等。在这种情况下,退出while循环并且程序可以安全退出。
masterQueue
因为,当抛出信号时,thread2没有推送新数据,所以thread1中的控制被卡在
class Context
{
void launch()
{
boost::thread thread1(boost::bind(&Context::push,this ) );
boost::thread thread2(boost::bind(&Context::process,this ) );
std::cout<<"Joining Thread1"<<std::endl;
thread1.join();
std::cout<<"Joining Thread2"<<std::endl;
thread2.join();
}
void process()
{
Data data;
while(status)
{
_masterQueue.wait_and_pop(data); //Blocking Call
//Do something with data
}
}
void push()
{
while(status)
{
//Depending on some internal logic, data is generated
_masterQueue.push(data);
}
}
};
如何强制阻止此阻止呼叫?
答案 0 :(得分:0)
超时实际上是你的答案 你在获得答案或中断时打破了循环
你也可以通过使用一个noop到队列
来欺骗一些东西答案 1 :(得分:0)
您可以在需要完成时尝试.interrupt()
线程。
如果.wait_and_pop()
使用标准的boost机制进行等待(条件变量等),即使在阻塞状态下它也会通过抛出 boost :: thread_interrupted 异常来中断。如果你的 masterQueue 类是可靠的wrt例外,那么这种中断是安全的。