在 std::async Future 中阻塞析构函数:技术说明
在 C 11 中使用 std::async 异步执行任务时,当销毁返回的 std::future 对象时,可能会遇到意外的阻塞行为。本文深入探讨了这种行为背后的原因、其含义以及 C 标准化委员会内部正在进行的讨论。
从 std::async 返回的 std::future 的析构函数有意阻塞以防止潜在的不一致和安全问题。根据 C 标准委员会成员发表的论文,这种阻塞行为对于确保关联线程不会比引用 std::future 的寿命更长至关重要。
如果没有这种阻塞行为,则存在以下风险:创建“失控”线程,这些线程在 std::future 被破坏后继续执行,从而导致潜在的内存损坏或数据丢失。当异步任务执行期间抛出意外异常时,可能会发生这种情况,导致 std::future 上的任何后续 get() 或 wait() 操作被绕过。
为了减轻这种风险, std::future 的阻塞析构函数通过确保关联线程在 std::future 对象被销毁之前完成来提供安全网。此行为需要程序员进行显式处理,程序员必须确保在 std::future 超出范围之前执行任何必要的 get() 或 wait() 操作。
尽管有支持非-阻塞析构函数,C 标准委员会决定在 C 14 中保留阻塞行为。但是,根据社区内正在进行的讨论,建议的更改可能会在 C 标准的未来修订版中引入。
以上是为什么 `std::future` 析构函数会在 `std::async` 中阻塞?的详细内容。更多信息请关注PHP中文网其他相关文章!