为什么要阻塞: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