2017-06-21 55 views
1

我的問題是我在下面指出ERROR的那一行給出錯誤,因爲std :: thread構造函數計算出要調用的函數並且需要函數簽名所需的參數 。通過模板函數在單獨線程中運行帶有std :: bind函數參數的打包任務的能力

有什麼辦法解決這個問題嗎?如果我試圖解碼來自packaged_task的函數名稱和參數列表,那麼我無法使用get_future函數來打包任務,並且需要添加我自己的承諾/將來的代碼來處理這個問題。

#include<iostream> 
#include<string> 
#include<thread> 
#include<future> 
#include<functional> 

using namespace std; 

int sampleAddFunction(const int& a, const int& b) 
{ 
    int sum = a + b; 
    cout << "sum = " << sum << endl; 
    return(sum); 
} 

template<typename T> T asyncExecutor(std::packaged_task<T(T, T)>&& package) 
{ 
    std::future<T> result = package.get_future(); 
    std::thread task_td(std::move(package)); // ERROR here as the std::thread identifies the function name from package and requires the params to be passed. How to handle this ? 
    task_td.join(); 
    return(result.get()); 
} 

int main(int argc, char* argv[]) 
{ 

    // Executing via directly calling through main. 
    int testResult1 = sampleAddFunction(100, 200); 
    cout << "testResult1 = " << testResult1 << endl; 

    // Attempt to create a std::packaged_task and then run it in another thread. 
    std::packaged_task<int(int,int)> task(std::bind(sampleAddFunction, 10, 20)); 
    std::future<int> result = task.get_future(); 
    std::thread t(std::move(task), 100, 200); // 100 and 200 are dummy parameters. 
    t.join(); 
    int testResult2=result.get(); 
    cout << "testResult2 = " << testResult2 << endl; 

    // Attempt to run this in seperate thread and get results. 
    std::packaged_task<int(int,int)> task2(std::bind(sampleAddFunction, 15, 27)); 
    int testResult3 = asyncExecutor<int>(std::move(task2), 100, 200); 
    cout << "testResult3 = " << testResult3 << endl; 

} 

回答

0

這應該有效。

#include<iostream> 
#include<string> 
#include<thread> 
#include<future> 
#include<functional> 

using namespace std; 

int sampleAddFunction(int a, int b) 
{ 
    int sum = a + b; 
    cout << "sum = " << sum << endl; 
    return(sum); 
} 

template<typename R, typename F, typename... Ts> 
R asyncExecutor(F&& package, Ts... args) 
{ 
    std::future<R> result = package.get_future(); 
    std::thread task_td(std::move(package), args...); 
    task_td.join(); 
    return(result.get()); 
} 

int main(int argc, char* argv[]) 
{ 
    std::packaged_task<int(int,int)> task2(sampleAddFunction); 
    int testResult3 = asyncExecutor<int>(std::move(task2), 15, 27); 
    cout << "testResult3 = " << testResult3 << endl; 
} 
0

您是從無參構造函數的二進制packaged_task(std::packaged_task<int(int,int)>),你的綁定(std::function<int()>)的結果。

你應該或者不使用綁定,或有asyncExecutor接受無參packaged_task(std::packaged_task<T()>

int sampleAddFunction(const int& a, const int& b) 
{ 
    int sum = a + b; 
    cout << "sum = " << sum << endl; 
    return(sum); 
} 

template<typename T, typename ... ARGS> T asyncExecutor(std::packaged_task<T(ARGS...)>&& package, ARGS ... args) 
{ 
    std::future<T> result = package.get_future(); 
    std::thread task_td(std::move(package), args...); 
    task_td.join(); 
    return(result.get()); 
} 

int main(int argc, char* argv[]) 
{ 
    std::packaged_task<int()> task(std::bind(sampleAddFunction, 10, 20)); 
    int testResult = asyncExecutor(std::move(task)); 
    cout << "testResult = " << testResult << endl; 
    std::packaged_task<int(int,int)> task2(sampleAddFunction); 
    int testResult2 = asyncExecutor(std::move(task2), 15, 27); 
    cout << "testResult2 = " << testResult2 << endl; 
} 
相關問題