為什麼要阻塞: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 標準化委員會內部爭論的話題。提議的棄用阻塞行為或使其成為非同步 futures 非標準的更改尚未被接受。
總而言之,std::async 傳回的 futures 的阻塞析構函數是出於安全考慮而引起爭議的設計選擇。雖然它可以防止與不受控制的執行緒執行相關的潛在問題,但它還引入了對執行緒生命週期和範圍保護進行明確管理的需要,以確保正確的清理。
以上是為什麼 std::async Future 具有阻塞析構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!