packaged_tack<>函数是一个你可以先定义好任务的类型,但是不想马上启动。函数可以在你想要启动任务是启动,你只需要调用你声明的函数就可以。

#include <future>
#include <iostream>
#include <exception>
#include <thread>
#include <chrono>
using namespace std;

double compute(int x, int y)
{cout << x << y << endl;
    cout << "this Thread Start: " << this_thread::get_id() << endl;
    
    try{
        for (int i = 0; i < 5; ++i)
            this_thread::sleep_for(chrono::milliseconds(2000));
    }
    catch (const exception& e)
    {
        cerr << "EXCEPTION: " << e.what() << endl;
    }
    return x > y;
}

int main()
{
    try{
        packaged_task<double(int, int)> task(compute);//定义一个task,并不要马上开始,什么时候开始由你什么时候调用task();
        future<double> f = task.get_future();//用来获取线程结果
        thread t([]{
            try{
                cout << "Main Thread Start: " << this_thread::get_id() << endl;
                for (int i = 0; i < 10; ++i)
                {
                    this_thread::sleep_for(chrono::milliseconds(500));
                    cout.put('@').flush();
                }
            }
            catch (const exception& e)
            {
                cerr << "EXCEPTION: " << e.what() << endl;
            }


        });
        this_thread::sleep_for(chrono::milliseconds(5000));
        task(7, 5);//当task调用时其线程才开始,所以它必须在f.get()前调用,否则线程一直等待
        double res = f.get();
        
        cout << res << endl;
    }
    catch (const exception& e)
    {
        cerr << "EXCEPTION: " << e.what() << endl;
    }
    
    
    system("pause");
    return 0;
}