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

时间:2013-05-02 14:30:14

标签: multithreading c++11 signals posix

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

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

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

1 个答案:

答案 0 :(得分:1)

2.4 Signal Concepts

  

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

     

...

     

为进程生成的信号应该传递给进程内的其中一个线程,这些线程在调用sigwait()函数时选择该信号或​​者没有阻止信号的传递。

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

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