该博客通过观看b站视频 [C++ 多线程并发 基础入门教程] 1.5 std::packaged_task std::async 进行的笔记总结,up主讲的非常好,适合了解一点多线程知识,想快速入门的同学
使用总结:
使用 | 解释 |
---|---|
async | 可以使函数在当前线程或子线程运行,并且返回一个future类型的对象,可以使用这种方法从线程中返回值 |
packaged_task | 可以对函数包装,在多线程中就可以直接调用其future获取返回值 |
引出问题(获取子线程结果,代码还是太多)
在1.4节中,我们只是需要获取子线程的结果,需要这么多代码
#include <iostream>
#include <thread>
#include <mutex>
#include <future>
void task(int a, int b, std::promise<int>& ret)
{
int ret_a = a * a;
int ret_b = b * 2;
ret.set_value(ret_a + ret_b);
}
int main()
{
int ret = 0;
std::promise<int> p_ret;
std::future<int> f_ret = p_ret.get_future();
std::thread t(task, 1, 2, std::ref(p_ret));
// do something
// get the reture value
std::cout << "return value is " << f_ret.get();
t.join();
return 0;
}
方案一:使用async
我们可以使用async,让函数直接返回,这边返回值是future类型,可以获取返回值了。
注意:async可以让函数在子线程运行,也可以让其在当前线程运行(延迟调用)
#include <iostream>
#include <thread>
#include <future>
int task(int a, int b)
{
int ret_a = a * a;
int ret_b = b * 2;
return ret_a + ret_b;
}
int main()
{
int ret = 0;
std::future<int> fu = std::async(task, 1, 2);
// 创建新线程执行函数
//std::future<int> fu = std::async(std::launch::async,task, 1, 2);
// 在本线程执行,在需要fu.get()时才会运行任务
//std::future<int> fu = std::async(std::launch::deferred, task, 1, 2);
std::cout << "return value is " << fu.get();
return 0;
}
方案二:使用packaged_task
使用packaged_task可以对函数包装,在多线程中就可以直接调用其future获取返回值
#include <iostream>
#include <thread>
#include <future>
int task(int a, int b)
{
int ret_a = a * a;
int ret_b = b * 2;
return ret_a + ret_b;
}
int main()
{
// 对任务进行打包
std::packaged_task<int(int, int)> t(task);
t(1, 2);
//std::packaged_task<int()> p(std::bind(task,1,2));
//p();
std::cout << "return value is " << t.get_future().get();
return 0;
}