2017-06-04 22 views
6

Ví dụ sau đây được lấy từ một C++ async tutorial:Làm thế nào để sử dụng một tương lai mà không cần chờ đợi?

#include <future> 
#include <iostream> 
#include <vector> 

int twice(int m) { return 2 * m; } 

int main() { 
    std::vector<std::future<int>> futures; 
    for(int i = 0; i < 10; ++i) { futures.push_back (std::async(twice, i)); } 

    //retrive and print the value stored in the future 
    for(auto &e : futures) { std::cout << e.get() << std::endl; } 
    return 0; 
} 

Làm thế nào tôi có thể sử dụng kết quả của một future mà không cần chờ cho nó? Tức là tôi muốn làm một cái gì đó như thế này:

int sum = 0; 
    for(auto &e : futures) { sum += someLengthyCalculation(e.get()); } 

tôi có thể vượt qua một tham chiếu đến future-someLengthyCalculation, nhưng tại một số điểm tôi phải gọi get để lấy giá trị, vì vậy tôi không biết làm thế nào để viết nó mà không cần đợi phần tử đầu tiên được hoàn thành, trước khi phần tử tiếp theo có thể bắt đầu tổng hợp.

+0

Bạn đang tìm kiếm một cái gì đó như 'then' và 'when_all' hoặc' when_any' continuations ? – kreuzerkrieg

Trả lời

4

Bạn đã đúng rằng thư viện future hiện tại chưa hoàn thành. Những gì chúng tôi bỏ lỡ là một cách để chỉ ra 'khi x trong tương lai đã sẵn sàng, bắt đầu vận hành f'. Đây là một số đẹp post about that.

Điều bạn có thể muốn là việc triển khai bản đồ/giảm: khi hoàn thành mỗi lần tương lai, bạn muốn bắt đầu thêm nó vào bộ tích lũy (giảm).

Bạn có thể sử dụng thư viện cho điều đó - không đơn giản để tự xây dựng nó :). Một trong những thư viện có được lực kéo là RxCpp - và chúng có một số post on map/reduce.

1

Thiết kế của tương lai vay chính nó để loại dung dịch, nơi bạn tạo thêm kỳ hạn đại diện cho các giá trị tính toán:

std::vector<std::future<int>> calculated_futures; 

    for (auto &e : futures) { 
     calculated_futures.push_back(
      std::async([&e]{ return someLengthyCalculation(e.get()); }) 
    ); 
    } 

    int sum = 0; 
    for(auto &e : calculated_futures) { sum += e.get(); } 
+0

Có lẽ đó là câu trả lời của OP được giúp đỡ nhiều hơn ... Gợi ý: std :: biến đổi tương lai thành calculate_futures thành mục đích thể hiện tốt hơn. – xtofl

Các vấn đề liên quan