CtrlEvent的处理程序如何在多线程环境中工作?

时间:2017-08-27 22:53:37

标签: c multithreading winapi

在C控制台应用程序中,如果我在主线程中使用SetConsoleCtrlHandler并且还有其他线程正在运行,那么当事件发生时,所有线程都将停止并在新线程中执行处理程序吗?或者有没有办法只让一个线程执行处理程序而忽略其他的线程,有点像Unix中的pthread_sigmask

StackOverflow和互联网上的主题信息都不多,所以我希望这会有用。

1 个答案:

答案 0 :(得分:2)

以上都不是。

documentation for the handler routine

中所述
  

当收到信号时,系统会在过程中创建一个新线程来执行该功能。

如果您需要一个特定的线程来响应控制台控制信号,那么您有责任编写一个处理程序例程来联系该线程,使用最适合您的代码的线程间通信方法。

您还有责任确保处理程序例程是线程安全的,因为现有线程将在处理信号时继续正常运行。

请注意,控制台控制信号与POSIX信号不太相似。首先,它们通常仅影响控制台应用程序(GUI应用程序不会接收控制台控制信号),而另一方面,它们不是设计或打算用作IPC机制。当然,他们从不打断现有的线程。

Microsoft C运行时确实按标准要求实现C信号,但这些信号也不像POSIX信号;最值得注意的是,它们仅在进程内。作为特殊情况,如果您配置SIGINT处理程序,它将作为控制台控制处理程序实现,但此功能is officially unsupported我建议不要使用它。