2014-12-01 47 views
2

我遇到了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(); 
    } 
} 

回答

4

boost::exception_ptr()將默認構造一個類似於空指針的異常指針,這意味着在if-check中它將評估爲false,表示沒有錯誤。
boost::current_exception()返回指向catch子句中當前活動異常的異常指針。它基本上捕獲異常,以便您可以在if檢查中重新拋出異常。

作爲避免所有這些樣板代碼的替代方案,我建議使用std::async/boost::async,它提供了所有開箱即用的功能。

我不確定「正常」異常處理是什麼意思,但是這可以讓你處理調用端的錯誤,表明你的線程沒有完成它應該做的工作。