為什麼從 std::async 阻塞回傳 Future 的析構函式?
在 C 11 中,future 的析構函數由std::async 塊,導致潛在的死鎖。這種行為引發了關注,引發了標準化委員會內部的一系列提案和討論。
問題的癥結在於確保線程安全。如果沒有阻塞行為,可能會出現這樣的情況:關聯的執行緒在 future 被銷毀後繼續執行,而無法同步其完成。這可能會導致記憶體損壞,甚至損害系統安全性。
正如 Hans Boehm 在 N3679 中所解釋的,未處理的異常可能會繞過旨在等待完成的程式碼,從而加劇了這種情況。因此,阻塞析構函數起到了安全網的作用,防止了這種災難性的結果。
儘管進行了廣泛的審議,C 社群尚未就此事達成共識。從 C 14 開始,std::future 和 std::thread 的析構函式仍然阻塞。
但是,這種情況將來可能會改變。 Michael Wong 2013 年的旅行報告表明,雖然棄用 std::async 的動議失敗了,但人們越來越認識到其阻塞行為所帶來的潛在危險。
同時,程式設計師應該意識到這一點發出並採用適當的措施,例如範圍保護或顯式同步機制,以確保處理從 std::async 返回的 future 時的線程安全。
以上是為什麼 `std::async` Future 的析構函式會阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!