2017-05-19 79 views
2

在使用packaged_task時,我收集了向量中的所有期貨。之後,我用get()推回未來的值。但是,我得到了錯誤的答案。誰能幫忙?非常感謝你。如何獲得未來的價值?

#define BOOST_THREAD_PROVIDES_FUTURE 

#include <boost/thread/future.hpp> 
#include <vector> 
#include <iostream> 

using namespace std; 

vector<int> subFun(int n) { 

    vector<int> a{ 2 * n, 3 * n }; 

    return a; 
} 

int main() { 

    vector<boost::future<vector<int>>> g; 
    vector<vector<int>> x(10, vector<int>(2)); 
    int i; 

    for (i = 0; i < 10; i++) { 
     boost::packaged_task<vector<int>> task{ boost::bind(&subFun, i) }; 
     g.push_back(task.get_future()); 
     boost::thread t{ std::move(task) }; 
    } 

    for (auto& m : g) { 
     x.push_back(m.get()); 
    } 

    cout << x[3][0] << endl;//should be 6, now is 0 

    return 0; 
} 
+0

你爲什麼不使用'STD :: promise'?順便說一句,這些現在都在標準庫中。而且,標籤C++ –

+0

想通了! –

回答

0

最真實的問題是,你的push_back成x,但你已經有了它初始化這裏:

vector<vector<int>> x(10, vector<int>(2)); 

所以,你只需要添加10個元素,而不是把結果在指數0 ..9。我建議不預填充,如@帕特里克的答案,或者代替填充指定的時隙:

#define BOOST_THREAD_PROVIDES_FUTURE 

#include <boost/thread/future.hpp> 
#include <vector> 
#include <iostream> 

using namespace std; 

void subFun(int n, vector<int>& into) { 
    into = { 2 * n, 3 * n }; 
} 

int main() { 
    vector<boost::future<void>> futures; 
    vector<vector<int>> x(10, vector<int>(2)); 

    for (size_t i = 0; i < x.size(); i++) { 
     boost::packaged_task<void> task{ boost::bind(&subFun, i, std::ref(x[i])) }; 
     futures.push_back(task.get_future()); 
     boost::thread(std::move(task)).detach(); 
    } 

    for (auto& f : futures) 
     f.wait(); 

    cout << x[3][0] << endl; 
} 

你當然可以更復雜:

#define BOOST_THREAD_PROVIDES_FUTURE 

#include <boost/thread/future.hpp> 
#include <vector> 
#include <iostream> 

struct TaskResult { 
    int index; 
    std::vector<int> data; 
}; 

TaskResult subFun(int n) { 
    return { n, { 2 * n, 3 * n } }; 
} 

int main() { 
    std::vector<boost::future<TaskResult>> futures; 
    std::vector<std::vector<int>> x(10, std::vector<int>(2)); 

    for (size_t i = 0; i < x.size(); i++) { 
     boost::packaged_task<TaskResult> task{ boost::bind(&subFun, i) }; 
     futures.push_back(task.get_future()); 
     boost::thread(std::move(task)).detach(); 
    } 

    for (auto& f : futures) { 
     auto r = f.get(); 
     x[r.index] = r.data; 
    } 

    std::cout << x[3][0] << std::endl; 
} 
0

很多修修補補之後,我發現這個程序工作沒有中止陷阱(我很驚訝你沒有得到):

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

std::vector<int> subFun(int n) { 

    std::vector<int> a { 2 * n, 3 * n }; 

    return a; 
} 

int main() { 

    std::vector<std::future<std::vector<int>>> g; 
    std::vector<std::vector<int>> x; 

    int i; 

    for (i = 0; i < 10; i++) { 
     std::packaged_task<std::vector<int>(int)> task{ subFun }; 
     g.push_back(task.get_future()); 
     std::thread { std::move(task), i }.detach(); 
    } 

    for (auto& m : g) { 
     m.wait(); 
     x.push_back(m.get()); 
    } 

    std::cout << x[3][0] << std::endl; // is now 6 

    return 0; 
} 

轉換爲必要boostThis answer在尋找一些關鍵問題時非常有幫助。

+0

謝謝。我添加了m.wait(),但結果仍然是0而不是6. – Frankie

+0

中止陷阱可能是由於(無關的)比賽,其中'main'在線程消失之前結束。未連接的線程觸發異常程序終止,除非分離。 – sehe

+0

非常感謝您的答覆。我對未來有更清晰的瞭解。 – Frankie