发出std::async任务完成的信号

Signalling the completion of std::async task

本文关键字:信号 任务 std async 发出      更新时间:2023-10-16

我使用了std::async来加速任务的执行,该任务以前是按顺序执行的。

我的实现执行以下操作:

  1. 启动预先配置的任务数量(例如,最多10个并发任务)
  2. 这些任务的未来存储在一个向量中
  3. 一旦一个任务完成,它就会启动另一个任务,因此在任何时间点,最多有10个任务(此值已配置)正在运行
  4. 在启动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线程原语是有问题的;用它们来编写小助手是一个更好的主意。