我在Linux上用C++11编写了一个简单的多线程应用程序,我想通过发送SIGINT信号来终止服务器及其运行的线程。
显然,我的服务器应用程序使用了来自C++11 (std::thread等)的线程支持。虽然我在C++11 (std::signal)中找到了一些对信号处理的支持,但我找不到在多线程环境中处理信号的任何支持。
因此,我的问题是-在C++11中如何处理多线程应用程序中的信号,还是仅仅因为我的应用程序需要处理信号就必须依赖pthreads?
发布于 2013-08-19 12:44:42
2.4信号概念
在生成时,应确定信号是为进程生成的,还是为进程内的特定线程生成的。由可归因于特定线程的某些动作产生的信号,例如硬件故障,应为导致该信号产生的线程产生。与进程ID或进程组ID或异步事件(例如终端活动)相关联生成的信号将为该进程生成。 ..。 为该进程生成的信号必须被传递到进程中的其中一个线程,该线程正在调用选择该信号的σ()函数,或者没有阻止该信号的传递。
鉴于以上所述,在多线程进程中,一个常见的解决方案是阻止除一个线程之外的所有线程中的所有信号。一个线程通常会处理所有的进程信号,并告诉其他线程该做什么(例如终止),并且通常是主线程。在创建继承父线程信号掩码的其他线程之前,很容易阻止主线程中的信号。一旦主线程完成创建子线程并准备好处理信号,它就必须解除阻塞。
不幸的是,C++11没有为此提供任何方法。您必须使用POSIX函数。向下滚动到σ掩模中多线程进程中的信令,例如创建一个特殊的信号处理线程。如果在可以处理信号的主线程中使用事件循环,则不需要使用后者,只需在进入事件循环之前解除阻塞信号。
https://stackoverflow.com/questions/16340734
复制相似问题