c++11可以通过std::thread启动线程,也可以通过std::async来执行异步任务。std::async会返回一个std::future对象,当需要这个值的时候,需要调用这个对象的get()成员函数,并且会阻塞线程直到期望值状态变为就绪。
依赖的头文件#include <future>
std::async的启动策略:
1.std::launch::async,函数必须在其独立的线程上运行。
2.std::launch::defered,函数调用被延迟到get()或者wait()函数调用的时候才执行。
#include <iostream>
#include <future>
int do_some_thing()
{
int nRet = 100;
std::cout << "thread_id1:" << std::this_thread::get_id() << std::endl;
for(int i=0;i<5;i++)
{
std::cout<<i<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return nRet;
}
#include <future>
int main()
{
std::cout << "main_id1:" << std::this_thread::get_id() << std::endl;
std::future<int> data = std::async(std::launch::async, do_some_thing);
std::this_thread::sleep_for(std::chrono::seconds(6));
//当调用get的时候,会阻塞线程,当do_some_thing执行完成后,才会输出main_id2
//如果不调用get,会先输出main_id2,主线程继续往下走执行任务,互不干扰
data.get();
std::cout << "main_id2:" << std::this_thread::get_id() << std::endl;
return 0;
}
运行结果:
从线程的id号,可发现,函数是在单独的线程中运行的。函数中的sleep5秒钟,和main函数中的sleep6秒钟是同步运行的。调用data.get()会阻塞main函数中的执行过程,等待std::async的异步函数执行完毕之后,再接着走主函数。