Multithreading 终止C+中的多线程应用程序+;11通过POSIX信号

Multithreading 终止C+中的多线程应用程序+;11通过POSIX信号,multithreading,c++11,signals,posix,Multithreading,C++11,Signals,Posix,我在Linux平台上用C++11编写了一个简单的多线程应用程序,我想通过发送SIGINT信号来终止服务器及其正在运行的线程 显然,我的服务器应用程序使用C++11的线程支持(std::thread等)。虽然我在C++11中找到了一些对信号处理的支持(std::signal),但在多线程环境中找不到任何对信号处理的支持 所以我的问题是-有没有办法在C++11的多线程应用程序中处理信号,或者仅仅因为我的应用程序需要处理信号,我就必须依赖pthreads 在生成时,应确定信号是为过程还是为过程中的特定

我在Linux平台上用
C++11
编写了一个简单的多线程应用程序,我想通过发送
SIGINT
信号来终止服务器及其正在运行的线程

显然,我的服务器应用程序使用C++11的线程支持(
std::thread
等)。虽然我在C++11中找到了一些对信号处理的支持(
std::signal
),但在多线程环境中找不到任何对信号处理的支持

所以我的问题是-有没有办法在
C++11
的多线程应用程序中处理信号,或者仅仅因为我的应用程序需要处理信号,我就必须依赖
pthreads

在生成时,应确定信号是为过程还是为过程中的特定线程生成的。由特定线程的某些操作(如硬件故障)生成的信号,应针对导致生成信号的线程生成。应为流程生成与流程ID或流程组ID或异步事件(如终端活动)相关的信号

为进程生成的信号应正好传递给进程中的一个线程,该线程正在调用选择该信号的sigwait()函数,或者尚未阻止信号的传递

综上所述,在多线程进程中,一个常见的解决方案是在除一个线程外的所有线程中阻塞所有要处理的信号。一个线程通常会处理所有进程信号并告诉其他线程做什么(例如终止),并且通常是主线程。在创建继承父线程的信号掩码的其他线程之前,可以很容易地阻止主线程中的信号。一旦主线程创建完子线程并准备好处理信号,它就必须取消阻止这些信号


不幸的是,C++11没有为此提供任何方法。您必须使用POSIX函数。向下滚动至中的多线程进程中的信令,例如创建特殊信号处理线程的示例。如果在主线程中使用可以处理信号的事件循环,则不需要使用后者,在进入事件循环之前,只需解锁信号。

听起来你已经有了答案:std::signal和std::thread——为什么这些还不够?相关:如果你只想依赖标准的C++11函数怎么办?您能在创建线程时使用std::signal设置一个信号处理程序,而不阻塞信号,并简单地让一个随机线程捕获信号吗?信号处理程序必须简单,需要C链接,最好只访问volatile int。但这是否符合C++11标准,并在多线程环境中产生定义良好的行为?@JohnCaC2可能不会,信号大部分超出了C++标准的范围。我发现奇怪的是,要被保留的权力已经离开了C++ 11的每个线程信号屏蔽,但在STD中仍然保留线程的其余部分。在多线程应用程序中正确设置信号处理是编写企业级应用程序的关键部分。坦白说,这闻起来像是半生不熟的解决方案。现在,您回到libpthread来做这件事,结果是std线程和posix线程不健康地混合在一起,希望std使用pthread来完成它的任务scene@Waslap信号是不可移植的,支持信号的平台已经有了API来完成这项工作。只需在创建线程之前设置信号掩码,以便它们继承它并完成任务(只需要了解信号和线程如何交互)。或者,你可以卷起袖子,写一份完整的解决方案提案。但是,我觉得没有必要这样做。@Maxim Egorushkin您错过了我抱怨的一个重要部分:您如何知道您使用的特定每线程信号掩码操作与std:thread实现完全兼容,而不需要对两者都有复杂的了解?Linux sigprocmask明确声明适用于单线程应用程序。因此,您必须使用pthread_sigmask来更改每个线程的信号掩码,但是您如何知道std:thread也使用pthreads?你可以猜测,希望如此,但你能知道它会兼容吗?