gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:54:56 24 4
gpt4 key购买 nike

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

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

所以我的问题是 - 有什么方法可以在 C++11 中处理多线程应用程序中的信号吗?还是我必须依靠pthreads仅仅因为我的应用程序需要处理信号?

最佳答案

2.4 Signal Concepts :

At the time of generation, a determination shall be made whether the signal has been generated for the process or for a specific thread within the process. Signals which are generated by some action attributable to a particular thread, such as a hardware fault, shall be generated for the thread that caused the signal to be generated. Signals that are generated in association with a process ID or process group ID or an asynchronous event, such as terminal activity, shall be generated for the process.

...

Signals generated for the process shall be delivered to exactly one of those threads within the process which is in a call to a sigwait() function selecting that signal or has not blocked delivery of the signal.


综上所述,在多线程进程中,一种常见的解决方案是在除一个线程之外的所有线程中阻塞想要处理的所有信号。该线程通常会处理所有进程信号并告诉其他线程该做什么(例如终止)并且通常是主线程。在创建继承父线程的信号掩码的其他线程之前,很容易在主线程中阻塞信号。一旦主线程完成创建子线程并准备好处理信号,它必须解除对这些信号的阻塞。
不幸的是,C++11 没有为此提供任何方法。您必须使用 POSIX 函数。向下滚动到 pthread_sigmask 中的多线程进程中的信令例如,创建一个特殊的信号处理线程。如果您在主线程中使用可以处理信号的事件循环,则后者不是必需的,只需在进入事件循环之前解除对信号的阻塞即可。

关于multithreading - 通过 POSIX 信号终止 C++11 中的多线程应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com