」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 std::async Future 具有阻塞析構函式?

為什麼 std::async Future 具有阻塞析構函式?

發佈於2024-11-15
瀏覽:449

Why Do std::async Futures Have Blocking Destructors?

為什麼要阻塞:std::async 返回的Future 的阻塞析構函數背後的原因

處理非同步任務時, std: :async 傳回的future 因其阻塞行為而聞名,引發了對其必要性的質疑。為了深入研究這個設計選擇,讓我們探討導致其實現的問題和討論。

Herb Sutter 的論文「async、~future 和 ~thread」強調了與阻塞析構函數相關的安全注意事項。如果沒有這種行為,與未來關聯的「失控」執行緒可以在其關聯狀態被破壞後繼續執行。缺乏對任務完成的控制可能會導致記憶體損壞或其他意外問題。

Hans Boehm 的論文「Async() 未來的析構函數必須等待」提供了有關此問題的具體範例。如果沒有阻塞析構函數,則異常處理或外部事件可能會破壞任務執行的預期流程。正如 Boehm 指出的那樣,這可能會產生一個安全漏洞,攻擊者可以操縱異常的時間來利用作用域保護中的監督,從而導致堆疊覆蓋和進程劫持。

阻塞析構函數可作為防範措施這些潛在的危險,阻止了相關執行緒在 future 被銷毀後繼續執行。但是,請務必注意,此行為特定於具有非同步啟動策略的 std::async 傳回的 future。其他 future,例如 std::promise 傳回的 future 或來​​自平行演算法的 future,在其析構函數中不會表現出相同的阻塞行為。

儘管提出了安全問題,std::async future 的阻塞析構函數一直是 C 標準化委員會內部爭論的話題。提議的棄用阻塞行為或使其成為非同步 future 的非標準的更改尚未被接受。

總而言之,std::async 傳回的 future 的阻塞析構函數是出於安全考量而引起爭議的設計選擇。雖然它可以防止與不受控制的執行緒執行相關的潛在問題,但它還引入了對執行緒生命週期和範圍保護進行明確管理的需要,以確保正確的清理。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3