簡體   English   中英

pthreads:如何處理創建其他線程的主線程中的信號? (顯示的具體代碼)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM