首頁  >  文章  >  後端開發  >  為什麼 `std::async` 回傳的 `std::future` 析構函式會阻塞?

為什麼 `std::async` 回傳的 `std::future` 析構函式會阻塞?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-15 14:26:02862瀏覽

Why Does the `std::future` Destructor Returned by `std::async` Block?

std::async 傳回的std::future 析構函數的阻塞性質

當打算非同步啟動任務時,發現std: :async 傳回的std::future 的析構函數表現出阻塞行為。這引發了有關此設計決策背後的基本原理以及是否可以改進以提高便利性和效率的問題。

阻塞析構函數的論點

解決的主要問題之一阻塞析構函數正在防止「失控」執行緒。如果 std::future 在沒有等待關聯執行緒完成的情況下被銷毀,則可能會導致不可預測的行為和潛在的記憶體損壞。

如 Hans Boehm 的論文 (N3679) 所述,當執行緒對已經被銷毀的資料進行操作時。如果沒有阻塞析構函數,則執行緒可能會繼續存取和修改該數據,從而導致跨線程記憶體問題。

替代方法

有些人建議如果總是呼叫 get 或 wait 方法來檢索結果或等待完成,那麼非阻塞析構函數就足夠了。然而,Boehm 認為,依賴顯式呼叫容易受到監督,並可能導致安全漏洞。特殊情況,例如執行期間的異常​​,可能會繞過此類呼叫並導致建立失控執行緒。

當前狀態和未來發展

儘管內部正在進行討論C 標準委員會,C 14 中沒有計劃對std::future 析構函數的阻塞行為進行更改。但是,該問題仍在考慮中,C 的未來版本可能會解決此行為。

實踐建議

為了避免與阻塞析構函數相關的潛在問題,建議在銷毀std::async 傳回的std::future 之前始終呼叫get 或wait 。這確保關聯的線程已完成其執行,並且所有必要的資源都已釋放。

以上是為什麼 `std::async` 回傳的 `std::future` 析構函式會阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn