我遇到了this文章,它聲明(複製 - 爲了方便粘貼)。我不明白它,以及它如何更有利於通常的異常處理。在do_work
代碼中,error
實例作爲對新創建線程的引用傳遞。現在,如果出現錯誤,則會重新排列。那之後發生了什麼?以下方法做什麼?提升異常和線程安全性 - 優於常規異常處理
error = boost::exception_ptr();
error = boost::current_exception();
這是從鏈路
使用boost異常的另一好處是線程安全 能力。它允許在線程 之間進行例外處理而沒有問題。
例如這個函數拋出一個克隆就緒例外:
void do_work() { boost::exception_ptr error; boost::thread t(boost::bind(worker_thread,boost::ref(error))); t.join(); if(error) boost::rethrow_exception(error); }
可能被截獲並克隆到由其他線程 進行安全,例如:
#include <boost/exception_ptr.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> void do_work(); //throws cloning-enabled boost::exceptions void worker_thread(boost::exception_ptr & error) { try { do_work(); error = boost::exception_ptr(); } catch(...) { error = boost::current_exception(); } }