概述
c++11引入了 async函数,使得C++中实现异步任务回调实现起来比较简单
该函数来自头文件 #include <future>
函数原型
template<class Function, class... Args>
std::future<std::invoke_result_t<std::decay_t<Function>,
std::decay_t<Args>...>>
async(std::launch policy, Function&& f, Args&&... args);
template<class Function, class... Args>
std::future<std::invoke_result_t<std::decay_t<Function>,
std::decay_t<Args>...>>
async(Function&& f, Args&&... args);
标准延迟函数
sleep_for
std::this_thread::sleep_for(std::chrono::seconds(1));
异步方式运行函数
该用法为简易用法,理解一下原理即可,其实复杂的写法其实是差不多的,掌握简易的用法就能搞定80%的事情了。
std::future<int> fut = std::async (calculate, value);
函数:async隐式生成了线程,并启动了线程
std::future<int> 这个是指函数的返回类型,可以是自定义类型
获取执行结果
int result = fut.get();
在没有结果返回时,future对象的get方法会阻塞,直到结果返回
测试代码
#include <chrono>
#include <future>
#include <iostream>
int calculate (int x) {
auto start = std::chrono::system_clock::now();
std::cout << "Start calculation\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
auto delta = std::chrono::system_clock::now() - start;
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(delta);
std::cout << "Done in " << ms.count() << " ms\n";
return x*x;
}
void test(int value, int worktime) {
std::cout << "Request result of caclulations for " << value << std::endl;
std::future<int> fut = std::async (calculate, value);
std::cout << "Keep working for " << worktime << " ms" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(worktime));
auto start = std::chrono::system_clock::now();
std::cout << "Waiting for result" << std::endl;
int result = fut.get();
auto delta = std::chrono::system_clock::now() - start;
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(delta);
std::cout << "Result is " << result
<< ", waited for " << ms.count() << " ms"
<< std::endl << std::endl;
}
int main ()
{
test(5, 400);
test(8, 1200);
return 0;
}
测试结果
我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。