阻塞线程中断
Blocking thread interrupt
下面的进程函数从队列中读取数据并处理它。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是一个布尔值(在全局范围内)。这个布尔值默认设置为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,进程函数被编码为识别并退出循环。
超时实际上是你的答案在得到答案或中断时打破循环
您还可以通过让中断向队列
你可以在需要完成.interrupt()
线程时尝试。
如果.wait_and_pop()
使用标准的boost机制来等待(条件变量或类似的),那么即使在阻塞状态下,也肯定会通过抛出boost::thread_interrupted异常而中断。如果您的masterQueue类是可靠的异常处理,那么这样的中断是安全的。
相关文章:
- 使用 shared_ptr 在中断时结束多线程循环
- 如何使用 SIGINT 在第二个线程中断 getchar
- 可中断线程类 C++11 - 遇到错误?
- 指向成员对象的指针 - 中断线程
- 处理中断时,如何回到主gui线程
- 在 Visual Studio 中的调试中断时设置默认线程,C++
- 返回可中断线程的函数
- 多线程应用程序中的零MQ处理中断
- C++等待用户输入的中断线程
- 如何中断Asynch线程
- 捕获升压线程中断和退出线程的正确方法
- 中断已处于条件变量等待调用中的提升线程
- 中断正在执行MKL或其他第三方函数的线程
- 为什么我不能中断这个特定的提升::线程?
- 《C++并发在行动》中的可中断线程示例
- 使用 Boost::thread 实现可中断线程
- 可以优化中断线程安全
- Windows API中的不可中断线程部分
- 在一定时间后中断线程,在等待时不阻塞
- 为什么此代码被认为是可重复的,以及当操作系统中断线程时究竟会发生什么