std::packaged_taskの紹介と使用
10367 ワード
一、std::packaged_taskの概要
前編ではstd::promiseの使用方法を紹介したが、実は
利用promise:
ではstd::packaged_を使用します.taskは多くのことを簡略化しました
注:
前編ではstd::promiseの使用方法を紹介したが、実は
std::packaged_task
とstd::promise
は非常に似ており、簡単に言えばstd::packaged_task
はstd::promise>
のT= std::function
という調整可能なオブジェクト(関数、lambda式など)を包装し、使用方法を簡略化した.この可変オブジェクトの戻り結果を関連std::futureオブジェクトに渡します.利用promise:
// T
using T = std::function<int(int)>; // typedef std::function T;
//
int Test_Fun(int iVal)
{
std::cout << "Value is:" << iVal << std::endl;
return iVal + 232;
}
// std::promise pr1, int
std::promise<T> pr1;
// std::future fu1, std::promise get_future() pr1
std::future<T> fu1 = pr1.get_future();
ではstd::packaged_を使用します.taskは多くのことを簡略化しました
//
int Test_Fun(int iVal)
{
std::cout << "Value is:" << iVal << std::endl;
return iVal + 232;
}
// std::packaged_task pt1, Test_Fun
std::packaged_task<int(int)> pt1(Test_Fun);
// std::future , Test_Fun , pt1
std::future<int> fu1 = pt1.get_future();
注:
std::packaged_task
に関連付けられたstd::futureオブジェクトが保存するデータ型は、調整可能なオブジェクトの戻り結果型であり、例示的な関数の戻り結果型がintである場合、std::future
ではなくstd::future
と宣言されます.#include
#include
#include
#include
int Test_Fun(int a, int b, int &c)
{
//a=1,b=2,c=0
// , 5s
std::this_thread::sleep_for(std::chrono::seconds(5));
//c=233
c = a + b + 230;
return c;
}
int main()
{
// std::packaged_task pt1, Test_Fun
std::packaged_task<int(int, int, int&)> pt1(Test_Fun);
// std::future fu1, Test_Fun , pt1
std::future<int> fu1 = pt1.get_future();
//
int c = 0;
// t1, pt1
std::thread t1(std::move(pt1), 1, 2, std::ref(c));
// t1 ( Test_Fun )
int iResult = fu1.get();
std::cout << " :" << iResult << std::endl; // :233
std::cout << "c:" << c << std::endl; //c:233
return 1;
}