一、std::future的其他成员函数
引言
#include <thread>
#include <future>
int mythread()
{
cout << "mythread() start" << "threadid = " << std::this_thread::get_id() << endl;
std::chrono::milliseconds dura(5000);
std::this_thread::sleep_for(dura);
cout << "mythread() end" << "threadid = " << std::this_thread::get_id() << endl;
return 5;
}
int main()
{
cout << "main threadid = " << std::this_thread::get_id() << endl;
std::future<int> result = std::async(mythread); //这里线程就开始执行了
cout << "continue......!" << endl;
cout << result.get() << endl;
cout << "I Love China!" << endl;
return 0;
}
注意:async异步任务 主线程会等待子线程执行完毕才会return返回
std::future::wait_for
主要返回一个枚举类型std::future_status
enum class future_status
{
ready,
timeout,
deferred
};
timeout
表示线程没执行完
ready
表示线程已经执行完,已经成功返回了
deferred
表示线程没开始执行
std::future_status::timeout
std::future_status::timeout
表示线程超时
#include <thread>
#include <future>
int mythread()
{
cout << "mythread() start" << "threadid = " << std::this_thread::get_id() << endl;
std::chrono::milliseconds dura(5000);
std::this_thread::sleep_for(dura);
cout << "mythread() end" << "threadid = " << std::this_thread::get_id() << endl;
return 5;
}
int main()
{
cout << "main threadid = " << std::this_thread::get_id() << endl;
std::future<int> result = std::async(mythread); //这里线程就开始执行了
cout << "continue......!" << endl;
std::future_status status = result.wait_for(std::chrono::seconds(1));
if (status == std::future_status::timeout) //超时:我想等待你(线程)1s,希望你返回,你没有返回,那么status = timeout
{
//超时:表示线程还没执行完
cout << "超时,线程还没有执行完" << endl;
}
return 0;
}
std::future_status::ready
std::future_status::ready
表示线程成功返回
#include <thread>
#include <future>
int mythread()
{
cout << "mythread() start" << "threadid = " << std::this_thread::get_id() << endl;
std::chrono::milliseconds dura(5000);
std::this_thread::sleep_for(dura);
cout << "mythread() end" << "threadid = " << std::this_thread::get_id() << endl;
return 5;
}
int main()
{
cout << "main threadid = " << std::this_thread::get_id() << endl;
std::future<int> result = std::async(mythread); //这里线程就开始执行了
cout << "continue......!" << endl;
// cout << result.get() << endl;
// cout << "I Love China!" << endl;
std::future_status status = result.wait_for(std::chrono::seconds(6));
if (status == std::future_status::timeout) //超时:我想等待你(线程)1s,希望你返回,你没有返回,那么status = timeout
{
//超时:表示线程还没执行完
cout << "超时,线程还没有执行完" << endl;
}
else if (status == std::future_status::ready)
{
cout << "线程成功执行完毕,返回" << endl;
cout << result.get() << endl;
}
return 0;
}
现象:
main threadid = 139670424258368
continue......!
mythread() startthreadid = 139670406264576
mythread() endthreadid = 139670406264576
线程成功执行完毕,返回
5
std::future_status::deferred
表示延迟的意思
如果async的第一个参数被设置为std::launch::deferred
,
即把std::future<int> result = std::async(mythread);
换成std::future<int> result = std::async(std::launch::deferred,mythread);
则本条件成立.
补充:如果用std::launch::deferred
参数,实际上没有创建真正的子线程,而是再主线程中执行,且在std::future::get()
才能执行该线程
else if (status == std::future_status::deferred)
{
cout << "线程被延迟执行" << endl;
cout << result.get() << endl;
}
二、std::shared_future
引言
#include <thread>
#include <future>
int mythread(int mypar)
{
cout << "mythread() start threadid = " << std::this_thread::get_id() << endl;
std::chrono::milliseconds dura(5000);
std::this_thread::sleep_for(dura);
return 5;
}
void mythread2(std::future<int> &tmpf)
{
cout << "mythread2() start" << " threadid = " << std::this_thread::get_id() << endl;
auto result = tmpf.get();
cout << "mythread2 result = " << result << endl;
return;
}
int main()
{
cout << "main threadid = " << std::this_thread::get_id() << endl;
std::packaged_task<int(int)> mypt(mythread);
std::thread t1(std::ref(mypt),1);
t1.join();
std::future<int> result = mypt.get_future();
std::thread t2(mythread2,std::ref(result));
t2.join();
cout << "I Love China!" << endl;
return 0;
}
问题:
为什么auto result = tmpf.get();
第二次get会得到异常?
答:
主要是因为get
的设计,是一个移动语义,get
相当于把tmpf内容移动到result里面
如果有两个或者更多线程想要获得mythread结果
std::shared_future
也是个类模板
std::future
的get()
函数转移数据
std::shared_future
的get()
函数复制数据
std::shared_future<int> result_s(std::move(result));
std::shared_future<int> result_s(result.share());
执行完毕之后result_s里有值,而result里空了
可以用std::future::share()检测是否为空
int main()
{
cout << "main threadid = " << std::this_thread::get_id() << endl;
std::packaged_task<int(int)> mypt(mythread);
std::thread t1(std::ref(mypt),1);
t1.join();
std::future<int> result = mypt.get_future();
// std::shared_future<int> result_s(std::move(result));
std::shared_future<int> result_s(result.share());
std::thread t2(mythread2,std::ref(result_s));
t2.join();
cout << "I Love China!" << endl;
return 0;
}
void mythread2(std::shared_future<int> &tmpf)
{
cout << "mythread2() start" << " threadid = " << std::this_thread::get_id() << endl;
auto result = tmpf.get();
cout << "mythread2 result = " << result << endl;
return;
}