知识卡片

void future传事件

普通读书笔记卡 · 1438

内容

promise/future 可把一次性事件传递给等待任务,无须靠轮询标志反复探测;共享状态保存事件结果,避免通知先到而被漏接。代价是共享状态分配及一次性限制;不能把这个模式直接当可重复使用的事件总线。

参考来源

- 位置:《Effective Modern C++》第7章《并发API》,条款三十九:对于一次性事件通信考虑使用 void 的 futures(源文件:_epub-src/EPUB/text/ch008.xhtml) - 结论依据:原文对照条件变量、轮询和promise/future,指出共享状态的内存成本与仅一次通信限制。 - 原始内容:对于简单的事件通信,基于条件变量的设计需要一个多余的互斥锁,对检测和反应任务的相对进度有约束,并且需要反应任务来验证事件是否已发生。 基于flag的设计避免的上一条的问题,但是是基于轮询,而不是阻塞。 条件变量和flag可以组合使用,但是产生的通信机制很不自然。 使用 std::promise 和 future 的方案避开了这些问题,但是这个方法使用了堆内存存储共享状态,同时有只能使用一次通信的限制。