C++ 执行std::thread::join()时执行SIGINT

C++ 执行std::thread::join()时执行SIGINT,c++,linux,multithreading,pthreads,C++,Linux,Multithreading,Pthreads,我有一个main()。 我希望能够CTRL-C控制程序,因此我将在main中安装SIGINT处理程序(spawn线程将忽略此信号)。当我在sig处理程序中时,我将使用cancel()取消生成的线程,但当前的“join()”会发生什么情况,它在信号调用期间处于活动状态。 我的猜测是,我将获得EAGAIN或EINTR,并且我必须在循环中创建join()。我说得对吗?多谢各位 问题是:这对mulithreading合法吗。我不介意用SIGINT句柄设置一个标志,但是join()调用会发生什么?std:

我有一个
main()。
我希望能够CTRL-C控制程序,因此我将在
main
中安装SIGINT处理程序(spawn线程将忽略此信号)。当我在sig处理程序中时,我将使用
cancel()
取消生成的线程,但当前的“join()”会发生什么情况,它在信号调用期间处于活动状态。 我的猜测是,我将获得EAGAIN或EINTR,并且我必须在循环中创建
join()
。我说得对吗?多谢各位

问题是:这对mulithreading合法吗。我不介意用SIGINT句柄设置一个标志,但是
join()
调用会发生什么?

std::thread::join()
有一个
void
返回类型,因此无法返回
EINTR
。在POSIX平台上,它很可能是围绕
pthread\u join
的包装器。如果在可连接线程上调用线程,则在成功连接线程之前,连接线程不应返回或抛出


另外,从信号处理程序中取消线程可能不安全
std::thread
没有
cancel()
成员函数,因此我认为您已经编写了自己的函数。因此,您需要检查它在信号处理程序中的使用是否安全---
pthread\u cancel()未列为可以从安全的函数调用,例如。

信号和线程?这里有龙!你必须,否则


信号处理程序通常不应假定它正在“主”线程中运行。相反,它应该发布一条消息并返回。主线程可以在稍后的事件循环或其他任何事件中获取此信息,然后加入。

你猜呢?或者你看到了这种行为并试图理解它?你能添加一个20行的程序来重现你所看到的吗?为什么不测试一下并找出答案呢?这听起来像是“为我做我的工作,告诉我发生了什么。”这实际上是我的猜测。我使用的是C++11线程工具,这只是缩进的简化版本。我怀疑在信号处理程序中调用
cancel()
是否合法。允许在一个函数中调用的函数很少。而且,由于在很多OSs上,信号可以传递到任何线程(包括您想要取消的线程),我怀疑任何线程管理功能都可能从线程处理程序中调用。@Tudor:也许他真正想问的是“保证什么行为”,谢谢您的回答。是的,
join()
void
,但是它可以抛出
std::system\u错误
,它可以嵌入
EINTR
,这不是问题。是的,std::thread没有
cancel()
,我将使用我的实现。基本上,我想标记线程以取消其自身。
join()
不应该抛出任何东西,除非线程不可连接(例如,因为您已经在
native\u handle()
上偷偷地使用了
pthread\u join()
)。我已经阅读了
pthread\u join()
手册页,它明确声明它不会返回EINTR。我将尝试实现这个逻辑,并在这里报告。谢谢你的链接。这就是我所需要的。