在std::async Future 中阻塞析構函數:技術說明
在C 11 中使用非同步執行任務時,當銷毀傳回的std::future 物件時,可能會遇到意外的阻塞行為。本文深入探討了這種行為背後的原因、其意義以及 C 標準化委員會內部正在進行的討論。
從 std::async 傳回的 std::future 的析構函數有意阻塞以防止潛在的不一致和安全問題。根據 C 標準委員會成員發表的論文,這種阻塞行為對於確保關聯線程不會比引用 std::future 的壽命更長至關重要。
如果沒有這種阻塞行為,則存在以下風險:創建「失控」線程,這些線程在 std::future 被破壞後繼續執行,從而導致潛在的記憶體損壞或資料遺失。當非同步任務執行期間拋出意外異常時,可能會發生這種情況,導致 std::future 上的任何後續 get() 或 wait() 操作被繞過。
為了減輕這種風險, std::future 的阻塞析構函數透過確保關聯執行緒在 std::future 物件被銷毀之前完成來提供安全網。此行為需要程式設計師進行明確處理,程式設計師必須確保在 std::future 超出範圍之前執行任何必要的 get() 或 wait() 操作。
儘管有支持非-阻塞析構函數,C 標準委員會決定在 C 14 中保留阻塞行為。但是,根據社群內正在進行的討論,建議的變更可能會在 C 標準的未來修訂版中引入。
以上是為什麼 `std::future` 析構函式會在 `std::async` 中阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!