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

Tom*_*cek 7 multithreading posix signals c++11

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

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

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

Max*_*kin 1

2.4 信号概念

在生成时,应确定是否为进程或进程内的特定线程生成了信号。由特定线程的某些操作(例如硬件故障)生成的信号应为导致生成信号的线程生成。应当为进程生成与进程 ID 或进程组 ID 或异步事件(例如终端活动)相关的信号。

...

为进程生成的信号应准确地传递到进程中调用 sigwait() 函数选择该信号或​​尚未阻止信号传递的线程之一。

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

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