7

I wrote a simple multithreaded application in C++11 on Linux platform and I would like to terminate the server and its running threads by sending SIGINT signal.

Obviously my server application uses thread support from C++11 (std::thread etc.). Although I found some support for signal handling in C++11 (std::signal), I couldn't find any support for handling signals in multithreaded environment.

So my question is - is there any way how to handle signals in multithreaded application in C++11 or do I have to rely back on pthreads just because my application needs to deal with signals?

4

1 回答 1

1

2.4 信号概念

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

...

为进程生成的信号应准确传送到进程中正在调用选择该信号的 sigwait() 函数或未阻止信号传送的那些线程之一。

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

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

于 2013-08-19T12:44:42.947 回答