以下处理函数从队列中读取数据并对其进行处理。 masterQueue
的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 是一个 bool 值(在全局范围内)。默认情况下,此 bool 值设置为 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();
}
因为当一个信号被抛出时,thread2 没有新的数据被推送,thread1 中的控制停留在
_masterQueue.wait_and_pop(data);
如何强制中断此阻塞调用?
- 是否可以在不改变 wait_and_pop 的内部工作方式的情况下实现它
- 设置超时不是一种选择,因为数据可能会在几个小时内到达队列一次或每秒多次
- 我是否在接收到信号时推送特定类型的数据,例如 INT_MAX/INT_MIN,过程函数被编码以识别并退出循环。
最佳答案
超时其实就是你的答案 你在得到答案或被打扰时打破了循环
您还可以通过让中断将 noop 推送到队列来进行一些欺骗
关于c++ - 阻塞线程中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30636619/