[英]pthreads: How to handle signals in a main thread that creates other threads? (specific code shown)
我有一個主線程,它保留在main函數中,即我不像pthread_create那樣專門創建它,因為它沒有必要。 這個線程打開一個文件,然后創建其他線程,等待它們完成工作(即,連接),清理所有內容(指針,信號量,條件變量等等)。
現在,我必須應用此代碼來阻止SIGINT:
sigset_t set;
int sig;
sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);
while (1) {
sigwait(&set, &sig);
switch (sig) {
case SIGINT:
/* handle interrupts */
break;
default:
/* unexpected signal */
pthread_exit((void *)-1);
}
}
它說你必須使用main()函數啟動N + 1個線程並等待它們完成。 如果一個SIGINT信號到達程序,它應該由主線程處理,以便關閉程序及其線程一個干凈的方式
我懷疑的是我應該如何使用此代碼? 把它放在main()中創建的后台線程上是不對的? 因為我已經有了一個帶有退出標志的cicle,它創建並連接所有其他線程,所以我不明白這個代碼是否完全適用於所有完成/調用以啟動程序的主函數。 如果我把它放在一個線程上,用這個代碼和處理程序來清理,這是不是很忙呢?
“它說”? 怎么說? 家庭作業?
關於使用線程和信號進行編程,您應該首先了解的是,您幾乎無法控制信號傳遞到哪個線程。 如果您的主要線程想要獲取信號,它應該在創建任何新線程之前阻止信號,並在完成創建它們之后將其解鎖,以確保信號不會傳遞給它們。
但是 ,如果您遵循信號處理程序的最佳實踐,那么哪個線程處理信號可能無關緊要。 所有信號處理程序應該設置一個全局標志或寫一個字節到一個管道(無論哪個最好使主線程注意到信號發生。(注意,您不能使用條件變量或來自信號處理程序的任何鎖定原語! )正如您問題中的代碼片段一樣,阻塞信號和使用sigwait
也是可能的(再次注意,它需要在所有線程中被阻止),但是大多數程序都無法停止並等待信號;他們還需要等待條件變量和/或文件輸入。解決這個問題的一種方法是創建一個專用線程來調用sigwait
,但這樣做相當浪費。如果你已經使用了select
,那么這是一個更好的解決方案,將切換到可以等待信號和文件描述符事件的pselect
(同時)。
而不是向我們詢問答案(如果沒有看到你試圖使這個工作的完整程序,那將很難給出答案),你會更好地嘗試用線程來真正理解信號的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.