2013-01-08 57 views
0

我有一個C++應用程序,我使用Boost線程來提供併發性。基本示例如下:C++如何在線程產生函數中提升線程拋出的異常

processingThreadGroup->create_thread(boost::bind(process, clientSideSocket, this)); 

這裏,processingThreadGroup是一個共享指針在升壓線程池和工藝是我需要調用的函數。 clientSideSocket和這是應該傳遞給進程函數的參數。

在處理函數內部,如果檢測到錯誤,我會拋出一個自定義異常。進程函數將數據發送到遠程服務器。所以我的問題是,如何將這個錯誤傳遞給調用堆棧?清理完成後,我想關閉系統。試過以下內容:

try { 
    processingThreadGroup->create_thread(boost::bind(process, clientSideSocket, this)); 
} catch (CustomException& exception) { 
    //code to handle the error 
} 

但沒有奏效。任何想法如何正確地做到這一點?

謝謝!

+0

它看起來很像'std :: async' _does/do_do_,它使用'future'來處理返回值和異常。 –

回答

1

要傳播返回值和例外,您應該使用future s。這是一個簡單的方法:

// R is the return type of process, may be void if you don't care about it 
boost::packaged_task<R> task(boost::bind(process, clientSideSocket, this)); 
boost::unique_future<R> future(task.get_future()); 

processingThreadGroup->create_thread(task); 

future.get(); 

這有一些陷阱,你必須記住。首先,task的使用期限必須延長異步執行process。其次,get()將阻塞,直到task完成,並在成功結束時返回其值,或者在拋出異常時傳播異常。您可以使用各種功能來檢查future的狀態,如has_value(),has_exception(),is_ready()

+0

感謝您的建議。我是新的推動者,並會閱讀期貨。 – Izza

+0

@Izza:您發佈的代碼不是真實代碼,是嗎? 'bind'調用將嘗試創建一個_copy_套接字... –

+0

clientSideSocket只是一個識別套接字的整數。所以我不認爲這是一個問題。 – Izza