我有一个main()
,它产生一个线程,然后加入它。
我希望能够CTRL-C程序,所以我会在main
中安装SIGINT处理程序(生成线程将忽略此信号)。当我在sig-handler中时,我将使用cancel()
取消生成的线程,但是当前的'join()'会发生什么,它在信号调用期间处于活动状态。
我的猜测是我将获得EAGAIN或EINTR,我必须在循环中进行join()
。我对吗?谢谢。
问题是:这与多线程是否合法。我不介意只设置带有SIGINT句柄的标志,但join()
调用会发生什么?
答案 0 :(得分:2)
信号和线程?这里是龙!您必须fully-specify the masks,否则any thread may receive the signal。
信号处理程序通常不应该假设它在“主”线程中运行。相反,它应该发布一条消息并返回analagously to thread interruption。主线程可以稍后在事件循环或其他任何内容中进行选择,然后加入。
答案 1 :(得分:1)
std::thread::join()
的回复类型为void
,因此无法返回EINTR
。在POSIX平台上,它可能是pthread_join
的包装,does not return EINTR
。加入一个线程不应该返回或抛出,直到线程成功加入,只要在一个可连接的线程上调用它。
另外,从信号处理程序中取消线程可能不安全。 std::thread
没有cancel()
成员函数,所以我认为你已经编写了自己的函数。因此,您需要检查在信号处理程序中使用是否安全---例如,pthread_cancel()
未被列为可以安全地从signal handler调用的函数。