c++ - 是shared_future条件变量的合法替代品?
问题描述
Josuttis 状态 [“标准库”,第 2 版,第 1003 页]:
期货允许您阻塞,直到提供另一个线程的数据或另一个线程完成。然而,future 只能将数据从一个线程传递到另一个线程一次。事实上,future 的主要目的是处理线程的返回值或异常。
另一方面,ashared_future<void>
可以被多个线程使用,以识别另一个线程何时完成其工作。
此外,一般来说,高级并发特性(如future
s)应优先于低级并发特性(如condition_variable
s)。
因此,我想问一下:有没有什么情况(需要多线程同步)ashared_future<void>
不够用而acondition_variable
是必须的?
解决方案
正如@TC 和@hlt 的评论中已经指出的那样,future
s/ shared_future
s 的使用在很大程度上受到限制,因为它们只能使用一次。因此,对于每个通信任务,您都必须有一个新的future
. Scott Meyers 在以下文章中很好地解释了利弊:
第 39 条:考虑一次性事件通信的无效期货。
Scott Meyers:有效的现代 C++(重点是我的)
他的结论是,使用promise
/future
对避免了使用condidition_variable
s 的许多问题,提供了一种更好的方式来传达一次性事件。付出的代价是您为共享状态使用动态分配的内存,更重要的是,您必须为每个要通信的事件配备一个promise
/对。future
推荐阅读
- xaml - 触发扫描仪后如何在 Xamarin.Forms 中更改焦点?
- sed - 用 Sed 替换转义序列
- sas - SAS 将宽格式转换为长格式
- google-cloud-platform - 为什么基于服务帐户的身份验证优于用户帐户
- python - SQLAlchemy - 何时创建额外的模型和关系与仅将 JSON 存储在列中?
- php - 更新 Select 查询循环所基于的字段
- amazon-web-services - AWS MQTT 代理/规则调用中的日志信息不足
- c - C中的recv函数无法获得价值
- spring-boot - 使用动态主机和端口的 TCP 套接字客户端的 Spring 集成
- java - StreamResource 有时在关闭对话框窗口中单击下载按钮时找不到资源