shared_future <void>是condition_variable的合法替代品吗?

时间:2018-05-09 08:28:44

标签: c++ multithreading

Josuttis陈述[“标准图书馆”,第2版,第1003页]:

  

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

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

此外,通常,高级并发功能(例如future s)应该优先于低级别功能(例如condition_variable s)。

因此,我想问一下:是否有任何情况(需要同步多个线程),其中shared_future<void>是不够的,condition_variable是必不可少的?

2 个答案:

答案 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实现消息队列。这样的线程是另一个基于低级构建块的高级构造。所以,是的,拍摄高级构造,但不要指望在高级和低级之间进行一对一的地图映射。