簡體   English   中英

jthread vs std::async - jthread over std::async 的用例是什么

[英]jthread vs std::async - what is the use-case for jthread over std::async

我剛剛偶然發現了 std::jthread: https://en.cppreference.com/w/cpp/thread/jthread

似乎解決了與 std::async/future 已經解決的相同問題(盡管您可能需要強制 async std::async(std::launch::async, ...的行為立即運行。

所以我的問題是使用一個而不是另一個有什么意義? - 有什么不同嗎? jthread 是異步/未來的包裝器嗎?

抽象地說,它們非常相似。 假設一個使用std::launch::async而一個不調用std::jthread::detach 它們都接受同步函數並與當前執行線程同時運行它們。 它們都提供了一種等待完成的方法: std::future::getstd::jthread::join 它們都隱式地自動執行銷毀等待。

差異更多地在於特定的細節和保證。

應該注意的是,添加了std::jthread作為對std::thread的修復。 std::threadstd::async一起添加到 C++11 中,同樣的問題對這些有效。 因此, std::async還沒有“已經”解決了這個問題,它們是一起發布的,就與這個問題相關而言。 std::thread的問題在於它要求用戶始終joindetach線程, detach總是錯誤的,如果用戶忘記join ,程序將終止。

返回值的方式存在顯着差異。 std::async必須為返回值隱式分配一個共享位置。 這並不總是必要的:有時您不需要值,或者有時您知道異步操作將在當前 function 返回之前完成(因此,捕獲的堆棧變量就足夠了)。

std::async返回的std::future與以其他方式構造的那些之間存在有意義的區別。 銷毀時從std::async塊返回的那些,這不是典型的行為。 這使std::future的實現和心理 model 變得復雜。

處理異常的方式有很大的不同。 異常通過std::async傳播回來。

因此,評論是當場的。 std::async可以很容易地用std::threadstd::jthread實現,因此它處於更高的級別。 但相反, std::async會做出並不總是最優的隱式選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM