执行std :: thread :: join()时的SIGINT

时间:2012-02-01 10:47:49

标签: c++ linux multithreading pthreads

我有一个main(),它产生一个线程,然后加入它。 我希望能够CTRL-C程序,所以我会在main中安装SIGINT处理程序(生成线程将忽略此信号)。当我在sig-handler中时,我将使用cancel()取消生成的线程,但是当前的'join()'会发生什么,它在信号调用期间处于活动状态。 我的猜测是我将获得EAGAIN或EINTR,我必须在循环中进行join()。我对吗?谢谢。

问题是:这与多线程是否合法。我不介意只设置带有SIGINT句柄的标志,但join()调用会发生什么?

2 个答案:

答案 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调用的函数。