我已经使用std::async
来加速任务的执行,该任务以前是按顺序执行的。
我的实现执行以下操作:
虽然这样可以正常工作,但10个任务中的任何一个都可能先完成。我的实现总是等待向量中的第一个任务。有没有办法知道,首先完成了10项任务中的哪一项?
例如未来的对象本身表明它已准备就绪。
我希望实现类似于本文中提到的“WhenAny()”功能的功能:https://msdn.microsoft.com/en-us/library/jj155756.aspx
答案 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线程原语是有问题的;用他们写小帮手是个更好的主意。