簡體   English   中英

未捕獲 C++ 異常,程序以中止終止

[英]C++ Exception not caught, program terminates with abort

該程序在異常處理程序被捕獲之前終止

void main(){
    try{

       work1();

       std::thread joinableThread(
           [](){
               work2();
           }
       );

       work3();

       throw std::runtime_error("catch me if you can");

       joinableThread.join();

    } catch(const std::runtime_error& ex){
       std::cout << "You did it!" << std::endl;
    }
}

我想處理異常處理程序,但程序在堆棧展開期間終止。 我可以做些什么來確保在堆棧展開期間加入線程?

我認為在堆棧展開期間加入線程是一個壞主意。 暫停析構函數直到將來發生不受控制的事件使應用程序很難推理。

我相信,這是std::thread析構函數拋出而不是加入線程的原因之一。

現在,回答你的問題。

第一個解決方案非常簡單 - 將std::thread包裝在您自己的對象中,該對象調用join it 是析構函數。 我認為,由於上述原因,這不是很好的方法。

第二個選項是做另一個包裝對象 - 一個在它的析構函數中分離線程的對象。 這在我看來更好,但您顯然有一個線程的問題,該線程現在無法加入並等待完成。

為了緩解這種情況,您可以通過您選擇的任何機制來增加線程以表示它已完成,而不是等待該信號(從其他分離的線程發出信號)。 但是,如果本地線程使用將在堆棧展開期間被破壞的對象,這仍然會出現問題。 我認為這個問題沒有好的解決方案。

暫無
暫無

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

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