std::async 返回的 std::future 析构函数的阻塞性质
当打算异步启动任务时,发现std::async 返回的 std::future 的析构函数表现出阻塞行为。这引发了有关此设计决策背后的基本原理以及是否可以改进以提高便利性和效率的问题。
阻塞析构函数的论点
解决的主要问题之一阻塞析构函数正在防止“失控”线程。如果 std::future 在没有等待关联线程完成的情况下被销毁,则可能会导致不可预测的行为和潜在的内存损坏。
如 Hans Boehm 的论文 (N3679) 中所述,当线程对已经被销毁的数据进行操作。如果没有阻塞析构函数,线程可能会继续访问和修改该数据,从而导致跨线程内存问题。
替代方法
一些人建议如果始终调用 get 或 wait 方法来检索结果或等待完成,那么非阻塞析构函数就足够了。然而,Boehm 认为,依赖显式调用容易受到监督,并可能导致安全漏洞。异常情况,例如执行期间的异常,可能会绕过此类调用并导致创建失控线程。
当前状态和未来发展
尽管内部正在进行讨论C 标准委员会,C 14 中没有计划对 std::future 析构函数的阻塞行为进行更改。但是,该问题仍在考虑中,C 的未来版本可能会解决此行为。
实践建议
为了避免与阻塞析构函数相关的潜在问题,建议在销毁 std::async 返回的 std::future 之前始终调用 get 或 wait 。这确保关联的线程已完成其执行,并且所有必要的资源已被释放。
以上是为什么 `std::async` 返回的 `std::future` 析构函数会阻塞?的详细内容。更多信息请关注PHP中文网其他相关文章!