簡體   English   中英

使用std :: future和std :: async的依賴解決方案

[英]Dependency solver using std::future and std::async

我正在嘗試使用std::futurestd::async實現一個簡單的依賴解決方案。 目前,我不知道是否有可能這樣做。 問題是,我們可以將(尚不可用) future傳遞給async調用嗎? 如果沒有,那么實際上可以做些什么,以使功能鏈具有一些尚未准備就緒的輸入彼此調用? 也許可以覆蓋傳遞給延遲異步的值嗎?

可能我的描述令人費解,所以這里有個例子:

#include <iostream>
#include <future>
#include <map>

using namespace std;

int adder(future<int> a, future<int> b) {
    return a.get() + b.get();
}

int main() {
    map<char, future<int>> scheme;

    scheme['c'] = future<int>(async(launch::deferred, [] { return 1;}));
    scheme['a'] = future<int>(async(launch::deferred, adder, move(scheme['b']), move(scheme['c'])));
    scheme['b'] = future<int>(async(launch::deferred, [] { return 3;}));

    cout << scheme['a'].get() << endl;
}

我們應該有一個這樣的計划:

c
  \
    a ----- result
  /
b

結果為4 這段代碼失敗了: move只是一個空洞的future ,並將其傳遞給adder 如果我們將行與'a''b'交換,它將可以正常工作,但是通過這種方式,我們已經應該知道依賴項。

用諾言。 也許還有期貨。

template<class T>
struct problem {
  std::promise<std::shared_future<T>> p;
  std::shared_future<std::shared_future<T>> f;
  problem():f(p.get_future()){}
  template<class W, class...Args>
  void set(W&&work, Args&&...args){
    p.set_value(std::async(std::launch::deferred, std::forward<W>(work), std::forward<Args>(args)...));
  }
  T get(){
    return f.get().get();
  }
};

int adder(problem<int>& a, problem<int>& b) {
  return a.get() + b.get();
}
int main() {
  std::map<char, problem<int>> scheme;

  scheme['c'].set([] { return 1;} );
  scheme['a'].set(adder, std::ref(scheme['b']), std::ref(scheme['c']));
  scheme['b'].set([] { return 3;} );

  std::cout << scheme['a'].get() << '\n';
}

可能有更簡單的方法。

現場例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM