首页 > 解决方案 > 是shared_future条件变量的合法替代品?

问题描述

Josuttis 状态 [“标准库”,第 2 版,第 1003 页]:

期货允许您阻塞,直到提供另一个线程的数据或另一个线程完成。然而,future 只能将数据从一个线程传递到另一个线程一次。事实上,future 的主要目的是处理线程的返回值或异常。

另一方面,ashared_future<void>可以被多个线程使用,以识别另一个线程何时完成其工作。

此外,一般来说,高级并发特性(如futures)应优先于低级并发特性(如condition_variables)。

因此,我想问一下:有没有什么情况(需要多线程同步)ashared_future<void>不够用而acondition_variable是必须的?

标签: c++multithreading

解决方案


正如@TC 和@hlt 的评论中已经指出的那样,futures/ shared_futures 的使用在很大程度上受到限制,因为它们只能使用一次。因此,对于每个通信任务,您都必须有一个新的future. Scott Meyers 在以下文章中很好地解释了利弊:

第 39 条:考虑一次性事件通信的无效期货。
Scott Meyers:有效的现代 C++(重点是我的)

他的结论是,使用promise/future对避免了使用condidition_variables 的许多问题,提供了一种更好的方式来传达一次性事件。付出的代价是您为共享状态使用动态分配的内存,更重要的是,您必须为每个要通信的事件配备一个promise/对。future


推荐阅读