以下进程函数从队列中读取数据并对其进行处理。 的wait_and_pop
功能执行阻塞呼叫。因此,直到队列中可以读取的数据存在,控制才会继续前进。阻塞线程中断
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);
}
}
};
status是一个布尔值(在全局范围内)。这个布尔值默认设置为true。只有在SIGINT,SIGSESV等信号被捕获时,它才会变为false。在这种情况下,while循环退出并且程序可以安全退出。
bool status = true;
void signalHandler(int signum)
{
std::cout<<"SigNum"<<signum;
status = false;
exit(signum);
}
int main()
{
signal(SIGABRT, signalHandler);
signal(SIGINT, signalHandler);
signal(SIGSEGV, signalHandler);
Context context;
context.launch();
}
,因为没有新的数据是由线程2推当信号被抛出,线程1控制是停留在
_masterQueue.wait_and_pop(data);
如何强制此阻塞调用被打断?
- 是否有可能实现这一点没有改变wait_and_pop
- 配售超时的内部工作是不是一种选择,因为数据可以在队列曾经在几个小时或多次第二 到达
- 我是否在接收信号时推送特定类型的数据,例如INT_MAX/INT_MIN,其中过程函数编码为识别并退出循环。
退出时线程是否结束?为什么解除封锁? – perencia