我在Linux平台上的C++11
中编写了一个简单的多线程应用程序,我希望通过发送SIGINT
信号来终止服务器及其运行的线程。
显然我的服务器应用程序使用来自C ++ 11(std::thread
等)的线程支持。虽然我在C ++ 11(std::signal
)中找到了对信号处理的一些支持,但我找不到在多线程环境中处理信号的任何支持。
所以我的问题是 - 有没有办法如何在C++11
中处理多线程应用程序中的信号,或者我必须依赖pthreads
只是因为我的应用程序需要处理信号?
答案 0 :(得分:1)
在生成时,应确定是为过程生成了信号还是为过程中的特定线程生成了信号。应该为导致生成信号的线程生成由可归因于特定线程的某些动作(例如硬件故障)生成的信号。应为流程生成与流程ID或流程组ID或异步事件(如终端活动)相关联生成的信号。
...
为进程生成的信号应该传递给进程内的其中一个线程,这些线程在调用sigwait()函数时选择该信号或者没有阻止信号的传递。
鉴于上述情况,在多线程过程中,常见的解决方案是阻止所有线程中除了一个线程之外的所有信号。一个线程通常会处理所有进程信号并告诉其他线程做什么(例如终止)并且通常是主线程。在创建其他线程之前,很容易阻塞主线程中的信号,继承父线程的信号掩码。一旦主线程完成创建子线程并准备处理信号,它必须取消阻塞它们。
不幸的是,C ++ 11没有提供任何方法。您必须使用POSIX功能。在pthread_sigmask中向下滚动到多线程进程中的信令,以获取创建特殊信号处理线程的示例。如果您在主线程中使用可以处理信号的事件循环,则不需要后者,只需在进入事件循环之前解锁信号。