August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
我们应该如何向一个需要结果的任务引入future呢?又如何向一个生成结果的线程引入对应的promise呢?标准库提供了packaged_task类型去简化将任务连接到future和promise的设置。一个packaged_task提供了一层包装代码,实现将某个任务的返回值或异常放入一个promise中(就像15.7.1节中代码所做的)。如果你通过调用get_future()来获取结果,packaged_task会返回给你对应其promise的future。例如,我们可以将两个任务连接起来,它们分别使用标准库accumulate()(参见14.3节)算法将一个vector<double>中的一半元素累加起来:
packaged_task模板接受模板参数表示任务的类型(本例中为Task_type,double(double*,double*,double)的别名),并接受构造函数参数作为任务(本例中为accum)。move()操作是必需的,因为packaged_task不能被拷贝。原因在于packaged_task是一种资源句柄:它拥有一个promise且(间接)负责其任务所拥有的资源。
请注意这段代码没有显式使用锁:通过使用packaged_task,我们可以集中精力于要完成的任务,而不必操心用来管理它们通信的机制。两个任务运行于两个独立的线程上,因此可以并行执行。 ...
Read now
Unlock full access