首页 理论教育 C++STL异步仿函数

C++STL异步仿函数

更新时间:2025-01-18 工作计划 版权反馈
【摘要】:STL还提供了仿async()函数。第一种声明形式是自动选择启动策略,通常可用的启动策略为launch::async|launch::deferred。此函数可临时存储共享状态,或者是被应用的线程句柄,或者是函数的备份和参数args,但并不使其状态设置为“ready”。1)策略launch::async。函数f是以指针形式代入async()函数的。async()函数的返回值是一个future类型对象,当函数f执行完毕之后,其共享状态被设置为“ready”。

STL还提供了仿async()函数。该函数有两种形式:

978-7-111-51399-5-Chapter16-102.jpg

其作用归根结底就是调用函数f。由于调用形式是异步的,因此并不等待函数f执行完毕即返回。函数f的返回值可以通过future类型对象进行访问,例通过future::get()函数。

第二种声明形式允许调用者选择一个特定的启动策略。第一种声明形式是自动选择启动策略,通常可用的启动策略为launch::async|launch::deferred。

此函数可临时存储共享状态,或者是被应用的线程句柄,或者是函数的备份和参数args,但并不使其状态设置为“ready”。一旦函数f的执行结束,共享状态将保存函数f的返回值,并标记状态为“ready”。

通常的启动策略有3种形式:launch::async、launch::deferred以及launch::async|launch::deferred。

1)策略launch::async。在async()函数被调用时即创建线程;返回的future类型对象被连接至被创建线程的末尾,即使共享状态不被访问,该对象的析构器和函数f的返回是同步的。因此,即使函数f返回值为void类型,其返回过程也不应该被认为是异步行为。

2)策略launch::deferred。延迟调用方式,需要等到future类对象调用wait()或者调用get()时,才创建线程。

3)策略launch::async|launch::deferred。自动选择策略。

函数f是以指针形式代入async()函数的。函数的返回值存储在共享状态中。如果函数f抛出异常,共享状态会被设置为异常状态。(www.xing528.com)

参数args是传递给函数f的参数,其类型应该和函数f的具体参数类型相匹配。

async()函数的返回值是一个future类型对象,当函数f执行完毕之后,其共享状态被设置为“ready”。其值可以通过future::get()函数获取。

说明该函数使用方法的例16-22其实完全可以使用16.5.3节的例16-20代替。

例16-22

978-7-111-51399-5-Chapter16-103.jpg

例16-22的执行效果如图16-23所示。

978-7-111-51399-5-Chapter16-104.jpg

图16-23 例16-22的执行效果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈