std::packaged_taskの紹介と使用


一、std::packaged_taskの概要
前編ではstd::promiseの使用方法を紹介したが、実はstd::packaged_taskstd::promiseは非常に似ており、簡単に言えばstd::packaged_taskstd::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;
}