发出std::async任务完成的信号
Signalling the completion of std::async task
我使用了std::async
来加速任务的执行,该任务以前是按顺序执行的。
我的实现执行以下操作:
- 启动预先配置的任务数量(例如,最多10个并发任务)
- 这些任务的未来存储在一个向量中
- 一旦一个任务完成,它就会启动另一个任务,因此在任何时间点,最多有10个任务(此值已配置)正在运行
- 在启动10个任务后,我的实现通过在未来调用get()来等待最旧的任务(即向量中的第一个任务)完成
尽管这很好,但10项任务中的任何一项都有可能首先完成。我的实现总是等待向量中的第一个任务。有没有办法知道,10项任务中哪一项先完成?
例如,未来对象本身发出准备就绪的信号。
我想实现类似于本文中提到的"WhenAny()"函数的功能:https://msdn.microsoft.com/en-us/library/jj155756.aspx
我认为WhenAny(C#)的等价物尚未被纳入C++11/14标准,认为它被认为是未来的实验扩展(见此)。我认为Boost库的最新版本包括when_ny,请查看此。该公司还销售一个完整的线程库,其中包括when_any。
给他们每个人一个ID,并使用原子存储第一个完成的ID。
在所有功能范围内的某个位置:
std::atomic<int> first_id(0);
每项任务完成时:
first_id.compare_exchange_strong(0, id);
其中id
是从1到10。它将只运行一次,第一个运行它的将是替换0的。
编辑:以上是你的字面问题的答案。但这并不能真正帮助你做你想做的事。要执行您想要的操作,我会将向量更改为一个队列,并让每个任务在下一个任务退出时排队(在修改队列之前,您还需要一个锁来锁定队列。)或者,您可以使用线程池。(无耻的插件:这是我的。)线程池可以让你将所有任务排队,但只使用n
线程,这将防止调度程序负担过重,同时仍然使编码变得简单。
使用线程池。对所有任务进行排队。当完成时,让他们向原子计数器报告,当计数器说所有操作都完成时,他们发出条件变量的信号。
线程池实现在堆栈溢出和其他地方比比皆是。
我发现在客户端代码中直接使用C++11线程原语是有问题的;用它们来编写小助手是一个更好的主意。
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 有没有任务栏API可以立即应用注册表更改
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 在条件变量中触发错误信号的频率是多少
- 如何创建线程序列以按照启动顺序执行任务?
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- C++一个线程如何正确通信其任务已完成?
- 升压信号2将插槽传递到成员功能以断开连接
- 使用两个任务之间的静音信号
- 发出std::async任务完成的信号
- QFutureWatcher 如何观察多个任务/期货和 finish() 信号
- 如何在QThread中正确处理来自长时间运行的任务的信号和事件