我在本章中所遵循的思路是:将任务当作可以与其他任务并发执行的函数来处理,这也是在所有思路中我认为最简单的,但同时又不失其强大性。它并非C+标准库所支持的唯一模型,但它能很好地满足广泛的需求。一些更为微妙和复杂的模型,如依赖于共享内存的程序设计风格,可以在需要时使用。
    如需启动可异步运行的任务,我们可以使用 async()

    1. double comp4(vector<double>& v) //如果v足够强大,则创建很多任务
    2. {
    3. if(v.size()<10000)
    4. return accum(v.begin(),v.end(),0.0);
    5. auto v0=&v[0];
    6. auto sz=v.size();
    7. auto f0=async(accum,v0,v0+sz/4,0.0); //第一个四分之一
    8. auto f1=async(accum,v0+sz/4,v0+sz/2,0.0); //第二个四分之一
    9. auto f2=async(accum,v0,v0+sz/2+sz*3/4,0.0); //第三个四分之一
    10. auto f3=async(accum,v0+sz*3/4,v0+sz,0.0); //第四个四分之一
    11. return f0.get()+f1.get()+f2.get()+f3.get(); //收集并组合结果
    12. }

    async()将一个函数调用的“调用部分”和“获取结果部分”分离开来,并将这两部分与任务的实际执行分离开来。通过使用 async(),你不必再操心线程和锁,而只需考虑可能异步执行的任务。这种做法显然受到了限制:不要试图对共享资源且需要用锁机制的任务使用 async()——使用async(),你甚至不知道要使用多少个 thread,因为这是由 async()来决定的,它根据它所了解的调用发生时系统可用资源量来确定使用多少个 thread。例如async()会先检査有多少可用核(处理器)再确定启动多少 thread
    请注意, async()并非专门为并行计算提高性能所设计的机制。例如,我们还可以用它来创建一个任务从用户那里获取信息,而让“主程序”继续进行其他计算(见42.4.6节)。