Josuttis陈述[“标准图书馆”,第2版,第1003页]:
期货允许您阻止直到提供另一个线程的数据或完成另一个线程。但是,未来只能将数据从一个线程传递到另一个线程。事实上,未来的主要目的是处理线程的返回值或异常。
另一方面,多个线程可以使用shared_future<void>
来识别另一个线程何时完成其工作。
此外,通常,高级并发功能(例如future
s)应该优先于低级别功能(例如condition_variable
s)。
因此,我想问一下:是否有任何情况(需要同步多个线程),其中shared_future<void>
是不够的,condition_variable
是必不可少的?
答案 0 :(得分:4)
正如@ T.C的评论中已经指出的那样。和@hlt一样,future
s / shared_future
的使用大多受到限制,因为它们只能使用一次。因此,对于每个通信任务,您必须拥有一个新的feature
。 Scott Meyers在以下方面很好地解释了优点和缺点:
第39项:考虑一次性事件的无效期货 通信。
Scott Meyers:有效的现代C ++(强调我的)
他的结论是,使用promise
/ future
对可以避免使用condidition_variable
s的许多问题,提供更好的沟通方式一次性强>事件。需要付出的代价是您为共享状态使用动态分配的内存,更重要的是,您要为每个要通信的事件设置一个promise
/ future
对。
答案 1 :(得分:1)
虽然使用高级摘要而不是低级摘要的概念值得称赞,但这里存在误解。 std::future
不是std::conditional_variable
的高级替代品。相反,它是针对std::condition_variable
的特定用例的特定高级构造构建 - 即,一次性返回值。
显然,并非所有条件变量的使用都适用于这种情况。例如,无论您尝试多少,都无法使用std::future
实现消息队列。这样的线程是另一个基于低级构建块的高级构造。所以,是的,拍摄高级构造,但不要指望在高级和低级之间进行一对一的地图映射。