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