8-futureその他のメンバー関数、shared_future
3312 ワード
その他のメンバー関数 wait_for()status.std::async()のパラメータがstd::launch::deferred(実行遅延)の場合、メインフローは引っかかりません. std::future_status std::future_status::ready:非同期タスクが完了したことを示すstd::future_status::timeout:非同期タスクがまだ実行されていないことを示し、待機時間を超えています::future_status::deferred:非同期タスクの実行が延期されたことを示し、wait_for()待たなくてもいいです.
二shared_future
std::futureのメンバー関数get()は、移動言語を使用しているため、一度しか呼び出されません.get()を呼び出した後、元のオブジェクトの値を別のオブジェクトに移動します. スレッドの戻り値を複数の他のスレッドに渡す場合は、std::futureではなく、std::shared_を使用します.future.そのget()関数は、意味を移動するのではなく、結果値を別のオブジェクトにコピーします.
#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
}
二shared_future
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;
}