发信号通知完成std :: async任务

时间:2016-04-15 20:11:18

标签: c++ c++11 asynchronous c++14

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

我的实现执行以下操作:

  1. 启动预配置数量的任务(例如,最多10个并发任务)
  2. 这些任务的未来存储在矢量中。
  3. 一旦完成一项任务,它就会启动另一项任务,以便在任何时间点,最多10个任务(此值已配置)正在运行。
  4. 启动10个任务后,我的实现通过在该未来调用get()来等待最旧的任务(即向量中的第一个任务)完成。
  5. 虽然这样可以正常工作,但10个任务中的任何一个都可能先完成。我的实现总是等待向量中的第一个任务。有没有办法知道,首先完成了10项任务中的哪一项?

    例如未来的对象本身表明它已准备就绪。

    我希望实现类似于本文中提到的“WhenAny()”功能的功能:https://msdn.microsoft.com/en-us/library/jj155756.aspx

3 个答案:

答案 0 :(得分:1)

给每个人一个ID并使用原子来存储完成的第一个。

所有功能范围内的某处:

std::atomic<int> first_id(0);

完成每项任务后:

first_id.compare_exchange_strong(0, id);

id的范围是1到10.它只运行一次,第一个运行它将是替换0的那个。

编辑:以上是您的文字问题的答案。但它并没有真正帮助你做你想做的事。为了做你想做的事情,我将向量更改为一个队列并让每个任务在退出时将其排队(在修改之前你还需要一个锁来锁定队列。)或者,你可以使用一个线程池。 (无耻插件:here's mine。)线程池可以让你将所有任务排入队列,但只使用n个线程,这样可以防止在调度程序过载的同时使编码变得简单。

答案 1 :(得分:1)

我认为相当于WhenAny(C#)尚未被纳入C ++ 11/14标准,认为它被视为未来的实验扩展(见this)。 我认为Boost库的最新版本包括when_any,请检查this。 这个company还出售了一个包含when_any。

的完整线程库

答案 2 :(得分:1)

使用线程池。排队所有任务。让他们在完成后向原子计数器报告,并在计数器显示完成后让他们发出条件变量信号。

线程池实现在堆栈溢出和其他地方比比皆是。

我发现直接在客户端代码中使用C ++ 11线程原语是有问题的;用他们写小帮手是个更好的主意。