2017-08-27 55 views
2

在C控制檯應用程序,如果我在主線程中使用SetConsoleCtrlHandler和我也有其他的線程中運行,將所有線程停止,當事件發生時的處理程序在一個新的線程中執行?或者有沒有辦法讓只有一個線程執行處理程序,並在其他程序中忽略它,有點像在Unix中的pthread_sigmaskCtrlEvents的處理程序在多線程環境中如何工作?

有沒有都在計算器上,並在互聯網上受到很多信息,所以我希望這會變成有用的。

回答

2

以上都不是。

documentation for the handler routine描述:

當接收到信號時,系統中的進程創建一個新的線程來執行該功能。

如果您需要一個特定線程來響應控制檯控制信號,那麼您有責任編寫一個處理程序例程來聯繫該線程,使用任何線程間通信方法最適合您的代碼。

這也是你的責任,以確保處理程序是線程安全的,因爲現有的線程將繼續運行正常,同時被處理的信號。


請注意,控制檯控制信號與POSIX信號不是很相似。一方面,它們通常隻影響控制檯應用程序(GUI應用程序不會接收控制檯控制信號),另一方面它們不是被設計或打算用作IPC機制。另外,他們當然不會中斷現有的線程。

微軟C運行時確實實現C信號,所要求的標準,但這些都不是很像POSIX信號要麼;最值得注意的是,它們只是進行內部處理。作爲特殊情況,如果您配置了一個SIGINT處理程序,它將作爲一個控制檯控制處理程序來實現,但此功能is officially unsupported和我建議不要使用它。

+0

是的,我不希望在所有使用POSIX信號,我寧願學習Windows的方式來解決這些問題。 如果我想讓線程正常終止,可以將窗口消息從處理程序發送到其他線程,然後從那裏管理關閉程序是一個好主意? –

+1

@EärendilBaggins:一個更好的方式來發信號線程終止是使用一個手動復位[事件對象(https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655.aspx),即線程定期檢查,並在發送信號後終止。您可以等待線程終止調用[WaitForMultipleObjects](https://msdn.microsoft.com/en-us/library/windows/desktop/ms687025.aspx)。 – IInspectable

+0

IMO,最好只對自然有窗口消息循環的線程使用窗口消息,這通常只是主線程。對於其他線程,它取決於他們在做什麼,但事件對象(如IInspectable所暗示的)通常是一個很好的通用選擇。 APC可以更加優雅,但這取決於線程的主循環是什麼樣子,並且可能有點難以掌握。 –