August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
我在本章中所遵循的思路是:将任务当作可以与其他任务并发执行的函数来处理,这也是各种各样的思路中我认为最简单的,但同时又不失其强大性。它并非C++标准库所支持的唯一模型,但它能很好地满足广泛的需求。一些更为微妙和复杂的模型,如依赖于共享内存的程序设计风格,可以根据需要使用。
如需启动可异步运行的任务,我们可以使用async():
基本上,async()将一个函数调用的“调用部分”和“获取结果部分”分离开来,并将这两部分与任务的实际执行分离开来。使用async(),你不必再操心线程和锁,只需考虑可异步计算结果的任务。但这显然有一个限制:不要试图对共享资源且需要用锁机制的任务使用async()——若使用async(),你甚至不知道要使用多少个thread,因为这是由async()来决定的——它根据调用发生时它所了解的系统可用资源量来确定使用多少个thread。
猜测计算任务和thread启动的相对开销是一种很原始的方法,而且容易得到关于性能的错误结论(例如使用v.size()<10000)。但我们不可能在本节详细讨论如何管理thread。因此,记住v.size()<10000只不过是一个简单而且可能很糟糕的实现,不要在实际代码中使用它。很少有必要手工并行化标准库算法,如accumulate(),因为reduce(par_unseq,/*...*/)这样的并行算法做得更好(参见14.3.1节)。但是,本节介绍的技术是通用的。
请注意,async()并非一个专门为并行计算提高性能所设计的机制。例如,我们还可以用它来创建一个任务以从用户获取信息,而让“主程序”继续进行其他计算(参见15.7.3节)。 ...
Read now
Unlock full access