簡體   English   中英

適當的多線程程序終止。 C

[英]Proper multi-thread program termination. C

嗨,我被這個問題困住了,我不知道哪個是最好的解決方案:

我有一個帶有一些線程的進程。 所有線程都屏蔽了信號,只有一個 (SignalHandler) 檢查是否有掛起的信號。

  while(!shouldEnd){
        if(!sigwait(&set, &signum)){
            if(signum == SIGINT){
                fprintf(stderr, "Ricevuto SIGINT\n");
            }
            else{
                //TODO
            }
        }
    }

現在我想在收到 SIGINT (例如)時終止其他線程。 我怎樣才能正確地做到這一點? 主要問題是其他線程可能正在等待條件變量或在 accept() 中等待(用於套接字連接)。 我認為放置一個像“shouldEnd”這樣的變量並在線程應該停止工作時將其設置為 1 是一件好事。 這是一個好主意嗎 ? 等待的呢? 主要用於等待套接字連接的那個?

因此,首先,我們不知道您使用的線程是什么。 您可能會考慮為此使用 libBoost,因為使用RAII 風格的鎖和諸如此類的東西會讓您的生活更輕松

無論如何,除非您啟用了信號屏蔽,否則只有進程的選定線程main()在大多數示例中通常為main() )才會捕獲信號 當您希望線程干凈地關閉時,您只需要:

  1. 通過修改您的 FD 設置以包含一個也可以喚醒阻塞調用的pipe喚醒等待accept()的線程。
  2. 簡單地向其他線程正在等待的條件變量發出信號,並設置某種互斥保護的布爾值/標志來通知線程它應該提前退出(即: mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock(); )。
  3. 假設您將線程生成為可連接的(即:非分離的) ,只需確保您擁有指向每個線程對象的指針的副本,並在向它們發出停止信號后對每個線程調用thread_join() 這將確保線程在main()退出之前完全停止。 如果不這樣做, main()可能會在線程完成之前退出,並在線程處於關閉邏輯中間時強行殺死它們,這很混亂,並且可能導致您的程序崩潰或更糟.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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