C 11 併發程式設計 16 在期望中儲存異常

2021-07-04 23:19:50 字數 1037 閱讀 6772

如果在非同步執行緒中發生了異常,等待期望的執行緒如何才能知道並且正確的處理異常呢?

假設有如下所示的乙個求平方根的函式:

double square_root(double x)

return sqrt(x);

}

通常,如果在當前執行緒上下文中呼叫square_root(),方法如下:

double y=square_root(-1);
在非同步執行緒中呼叫square_root(),方法如下:

std::futuref=std::async(square_root,-1);

double y=f.get();

理想情況下,兩種方式都能通過y獲得函式呼叫的執行結果。如果發生了異常,能讓呼叫者知道這個異常,就更好了。

實際上,如果在std::async中執行的函式丟擲了異常,這個異常將被儲存在期望中,期望變為就緒狀態,等待get()被掛起的執行緒將被喚醒,get()函式再次丟擲這個儲存在期望中的異常。

類似的,std::promise也有類似的功能,只不過需要我們顯示的set_exception()介面來設定:

try

catch(...)

這裡使用std::current_exception()來獲取當前丟擲的異常。除此之外,還可以使用std::copy_exception()直接產生乙個新的異常存放到promise之中:

some_promise.set_exception(std::copy_exception(std::logic_error("foo ")));
在異常型別確定的情況下,推薦使用這種方式,因為這樣比起try/catch塊不僅更加清晰,編譯器在優化**時,效果也更好。

到此為止,所有的示例**都在使用std::future,但是std::future也有一定的限制,因為只有乙個執行緒可以等待這個期望的返回。如果有多個執行緒需要等待同乙個事件,我們需要使用std::shared_future。

c 11併發程式設計入門

簡介 併發能夠充分利用多核心處理器,但並行程式設計卻面臨著嚴峻的挑戰。並行程式設計的乙個常見問題是資料同步,即多個語句同時訪問同一資源,當乙個執行緒在寫,而另乙個在讀時,就會造成不可預料的後果。加鎖可以在避免上述問題,但使用鎖本身也帶來了一系列問題,如死鎖 效率低下等。不良的 也可能造成cpu空轉等...

C 11併發程式設計 多執行緒std thread

c 11引入了thread類,大大降低了多執行緒使用的複雜度,原先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 thread noexcept 乙個空的std thread...

C 11 多執行緒 併發程式設計總結

建立std thread,一般會繫結乙個底層的執行緒。若該thread還繫結好函式物件,則即刻將該函式執行於thread的底層執行緒。執行緒相關的很多預設是move語義,因為在常識中線程複製是很奇怪的行為。joinable 是否可以阻塞至該thread繫結的底層執行緒執行完畢 倘若該thread沒有...