#include
#include
#include
using namespace std;
int mythread()
{
cout << "mythread start, thread id: " << std::this_thread::get_id() << endl;
std::this_thread::sleep_for(5s); // 休眠五秒
cout << "mythread end" << endl;
return 5;
}
int main()
{
cout << "main thread id: " << std::this_thread::get_id() << endl;
std::future result = std::async(std::launch::deferred,mythread);
cout << "continue ..." << endl;
std::future_status status = result.wait_for(3s); // 等会mythread运行一段时间,流程卡在这里
if (status == std::future_status::timeout) // 超时,等待mythread运行3S后返回值,但是没有返回
{
// 表示线程还没有执行完
cout << "time out" << endl;
}
else if (status == std::future_status::ready) // 执行完毕
{
// 表示成功返回
cout << "mythread execute finished" << endl;
cout << result.get() << endl;
}
else if (status == std::future_status::deferred) // 延迟执行
{
// 如果async的第一个参数被设置为std::launch::deferred,则本条件成立
// 根本没有创建子线程
// 此时result.wait_for()不会卡住主流程,直接跳到这里。
cout << "deferred " << endl;
cout << result.get() << endl;
}
cout << "I Love China" << endl;
getchar();
return 0; // 主线程返回之前,会等待mythread线程执行完毕才返回
}
std::future的成员函数get()只能调用一次,因为它使用的是移动语言。调用get()后,把原有对象的中的值移动到另一个对象中去。
如果想将线程的返回值传递给多个其它的线程,则不能使用std::future,而要使用std::shared_future。它的get()函数不是移动语义,而是将结果值复制到另外的对象中去。
#include
#include
#include
using namespace std;
int mythread(int para)
{
cout << "my thread start, thread id is " << std::this_thread::get_id() << endl;
cout << "parameter is " << para << endl;
std::this_thread::sleep_for(5s); // 线程休眠5秒
cout << "my thread end, thread id is " << std::this_thread::get_id() << endl;
return para;
}
void mythread2(std::shared_future &tmp_f)
{
cout << "thread2 result is " << tmp_f.get() << endl;
}
int main()
{
cout << "main thread id is " << std::this_thread::get_id() << endl;
std::packaged_task mypt(mythread);
std::thread t1(std::ref(mypt), 1);
t1.join();
std::future result = mypt.get_future();
std::shared_future result_s(std::move(result));
// 另一种写法
//std::shared_future result_s(result.share()); // 执行完毕后,result_s有值,result为空
bool vaild = result_s.valid(); // 能够判断result_s中的是不是有效值
cout << result_s.get() << endl;
cout << result_s.get() << endl; // 多次get,不会再产生问题
std::thread t2(mythread2, std::ref(result_s));
t2.join();
cout << "I Love China" << endl;
getchar();
return 0;
}