C++ 多线程使用future传递异常
如果 std::async 調(diào)用的函數(shù)拋出異常,那么這個(gè)異常會(huì)被存儲(chǔ)在值的位置,同時(shí) future 變?yōu)?ready ,如果調(diào)用 get() 會(huì)重新拋出存儲(chǔ)的異常。
Note:
標(biāo)準(zhǔn)并沒(méi)有指定原來(lái)的異常對(duì)象是被重新拋出或者拷貝后拋出,不同的編譯器會(huì)做不同的選擇。
對(duì)于 std::packaged_task<> 包裝的函數(shù)如果拋出異常,那么處理與 std::async 一致。 std::promise<> 提供類似的機(jī)制,如果期望存儲(chǔ)一個(gè)異常那么在 std::promise<> 對(duì)象上就需要使用 set_exception() 代替 set_value() 。
保存一個(gè)異常到 future 中的另外一個(gè)方式是在沒(méi)有調(diào)用 std::promise<> 的 set_xxxx 函數(shù)或者沒(méi)有執(zhí)行被 std::packaged_task<> 包裝的任務(wù)的情況下就銷毀與 future 關(guān)聯(lián)的 std::promise<> 和 std::packaged_task<>。無(wú)論哪種情況,析構(gòu)函數(shù)都會(huì)存儲(chǔ)一個(gè)錯(cuò)誤碼是 std::future_errc::broken_promise 的 std::future_error 異常,表示關(guān)聯(lián)的 future 并沒(méi)有 ready 。
#include <iostream> #include <future>int main() {// std::asyncstd::future<void> result1 = std::async([] { throw std::runtime_error("runtime error."); });try {result1.get();} catch (const std::runtime_error &e) {std::cout << "Async exception: " << e.what() << std::endl;}std::promise<int> promise;try {// 正常的情況就set_value // promise.set_value(66);// 主動(dòng)拋出一個(gè)異常進(jìn)行測(cè)試throw std::out_of_range("the value out of range.");} catch (...) {// 使用std::current_exception 存儲(chǔ)被拋出的異常;// 可以使用 std::copy_exception 存儲(chǔ)沒(méi)有被拋出的異常;promise.set_exception(std::current_exception());}try {promise.get_future().get();} catch (const std::out_of_range &e) {std::cout << "Promise exception: " << e.what() << std::endl;}// 存儲(chǔ)異常的其他方式,// 在沒(méi)有調(diào)用 std::promise的set_xxx函數(shù)// 或者沒(méi)有調(diào)用被 std::packaged_task 包裝的任務(wù)情況下// 就銷毀與 future關(guān)聯(lián)的 std::promise,std::packaged_task 對(duì)象// std::packaged_task<>std::future<void> future;try {// 提前銷毀task{std::packaged_task<void()> task([] {std::cout << "do packaged task." << std::endl;});future = task.get_future();}future.get();}catch (const std::future_error &e) {std::cout << "Packaged task exception: " << e.what() << std::endl;}// std::promise<>try {// 提前銷毀promise{std::promise<void> promise;future = promise.get_future();}future.get();}catch (const std::future_error &e) {std::cout << "Promise exception: " << e.what() << std::endl;}return 0; }更多內(nèi)容:https://blog.nas-kk.top/?p=106
總結(jié)
以上是生活随笔為你收集整理的C++ 多线程使用future传递异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: regionGrowth3D
- 下一篇: BT.1120数据流解释