执行std::thread::join()时的SIGINT
SIGINT while doing std::thread::join()
我有一个main()
,它生成一个线程,然后连接到它。我希望能够CTRL-C程序,所以我会在main
中安装SIGINT处理程序(派生线程将忽略此信号)。当我在sig处理程序中时,我将用cancel()
取消派生的线程,但当前的"join()"会发生什么,它在信号调用期间是活动的。我的猜测是,我会得到EAGAIN或EINTR,并且我必须在循环中生成join()
。我说得对吗?非常感谢。
问题是:这对多重阅读合法吗。我不介意在SIGINT句柄中设置一个标志,但是join()
调用会发生什么呢?
信号和线程?龙来了!您必须完全指定掩码,否则任何线程都可能接收到信号。
信号处理程序通常不应假定它在"主"线程中运行。相反,它应该发布一条消息并返回,类似于线程中断。主线程可以在稍后的事件循环或其他事件中接收到这一点,然后加入。
std::thread::join()
具有void
返回类型,因此无法返回EINTR
。在POSIX平台上,它可能是pthread_join
的包装器,它不返回EINTR
。连接线程不应返回或抛出,直到线程成功连接,前提是它是在可连接线程上调用的。
顺便说一句,从信号处理程序中取消线程可能不安全。std::thread
没有cancel()
成员函数,所以我认为您已经编写了自己的函数。因此,您需要检查它在信号处理程序中使用是否安全——例如,pthread_cancel()
没有被列为可以从信号处理程序安全调用的函数。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- ostream过载时的缓冲区冲洗
- 具有未知值时的时间复杂性
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 当比特(而不是字节)的顺序至关重要时的持久性
- 旋转模型矩阵时的形状失真
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 打印第二列时的2d字符矢量打印空间
- 读取文件时运行时的未知行为
- posix_spawn():使用posix_scawn()时的错误处理问题
- 查找最近配对时的OpenMP竞赛条件
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- 求和 int 乘以双倍时的欠/过近似
- 打包可变参数模板具有零元素时的递归
- 在Qt5中使用QTextSteam时的"使用已删除功能"
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 将 std::string 转换为大写时的 SIGINT
- 执行std::thread::join()时的SIGINT