[C++从零实现Json-Rpc框架]第三弹——C++11异步操作
一、前言
在本篇博文中,博主将为大家带来【C++从零实现Json-Rpc框架】的第三弹,即C++11中的异步操作,希望大家能够从中有所收获
二、正文
1.std::future 介绍
std::future是C++11标准库中的⼀个模板类,它表⽰⼀个异步操作的结果。当我们在多线程编程中使⽤异步任务时,std::future可以帮助我们在需要的时候获取任务的执⾏结果。std::future的⼀个重要特性是能够阻塞当前线程,直到异步操作完成,从⽽确保我们在获取结果时不会遇到未完成的操作。
注:std::futrue 本质上不是一个异步任务,而是一个辅助我们获取异步任务结果的东西
2. 应用场景
• 异步任务:当我们需要在后台执⾏⼀些耗时操作时,如⽹络请求或计算密集型任务等,std::future 可以⽤来表⽰这些异步任务的结果。通过将任务与主线程分离,我们可以实现任务的并⾏处理,从而提⾼程序的执⾏效率
• 并发控制:在多线程编程中,我们可能需要等待某些任务完成后才能继续执⾏其他操作。通过使⽤ std::future,我们可以实现线程之间的同步,确保任务完成后再获取结果并继续执⾏后续操作
• 结果获取:std::future提供了⼀种安全的⽅式来获取异步任务的结果。我们可以使⽤ std::future::get()函数来获取任务的结果,此函数会阻塞当前线程,直到异步操作完成。这样,在调⽤get()函数时,我们可以确保已经获取到了所需的结果
3. 用法介绍与示例
std::future并不能单独使用,需要搭配一些能够执行异步任务的模板类或者函数一起使用
异步任务搭配使用:
●std::async函数模版:异步执行一个函数,返回一个future对象用于获取函数结果
●std::packaged_task类模版:为一个函数生成一个异步任务对象(可调用对象),用于在其他线程中执行
●std::promi类模板:示例的对象可以返回一个对象,在其他线程中向promise对象设置数据,其他线程的关联future就可以获取数据
● 使用std::async关联异步任务
std::async是⼀种将任务与std::future关联的简单⽅法。它创建并运⾏⼀个异步任务,并返回⼀个与该 任务结果关联的std::future对象。默认情况下,std::async是否启动⼀个新线程,或者在等待future 时,任务是否同步运⾏都取决于你给的参数。这个参数为std::launch类型:
★ std::launch::deferred 表明该函数会被延迟调⽤,直到在future上调⽤get()或者wait()才会开始 执⾏任务
★ std::launch::async 表明函数会在⾃⼰创建的线程上运⾏
注: std::launch::deferred | std::launch::async内部通过系统等条件⾃动选择策略,也就是在调用async函数的时候可以通过参数的传递来选择任务执行的方式是同步还是异步。
#include #include #include int Add(int num1, int num2){ std::cout