在C控制台应用程序中,如果我在主线程中使用SetConsoleCtrlHandler
并且还有其他线程正在运行,那么当事件发生时,所有线程都将停止并在新线程中执行处理程序吗?或者有没有办法只让一个线程执行处理程序而忽略其他的线程,有点像Unix中的pthread_sigmask
?
StackOverflow和互联网上的主题信息都不多,所以我希望这会有用。
答案 0 :(得分:2)
以上都不是。
如documentation for the handler routine:
中所述当收到信号时,系统会在过程中创建一个新线程来执行该功能。
如果您需要一个特定的线程来响应控制台控制信号,那么您有责任编写一个处理程序例程来联系该线程,使用最适合您的代码的线程间通信方法。
您还有责任确保处理程序例程是线程安全的,因为现有线程将在处理信号时继续正常运行。
请注意,控制台控制信号与POSIX信号不太相似。首先,它们通常仅影响控制台应用程序(GUI应用程序不会接收控制台控制信号),而另一方面,它们不是设计或打算用作IPC机制。当然,他们从不打断现有的线程。
Microsoft C运行时确实按标准要求实现C信号,但这些信号也不像POSIX信号;最值得注意的是,它们仅在进程内。作为特殊情况,如果您配置SIGINT处理程序,它将作为控制台控制处理程序实现,但此功能is officially unsupported我建议不要使用它。