我相信這實際上是使用async
框架相當微不足道的。
如果你看看std::launch,你會發現有一個延遲模式:
std::launch::deferred
:任務是在調用執行線程首次被請求的結果(懶惰的評價)
因此,您可以啓動任務並僅在需要結果時執行該任務。但是,由於您提到了一個非循環圖,因此您可能想分享結果:a std::future
(通過致電std::async
返回)無法共享;你需要一個std::shared_future
這個。
就這樣,把它乾脆:
// Disclaimer:
// Compiles but does not run, but I have not figured it out.
// See: http://ideone.com/XZ49Dg
#include <future>
#include <iostream>
int main() {
std::shared_future<std::string> greeting = std::async(std::launch::deferred, []() {
std::string s;
std::cout << "Enter how you would like to be greeted: ";
std::getline(std::cin, s);
return s;
});
std::shared_future<int> choice = std::async(std::launch::deferred, []() {
int c = 0;
std::cout << "Pick any integer: ";
std::cin >> c;
return c;
});
std::shared_future<void> complete = std::async(std::launch::deferred, [=]() mutable {
std::string const g = greeting.get();
int const c = choice.get();
std::cout << "Hello " << g << ", you picked " << c << "!\n";
});
complete.wait();
}
是否有可能重新使用管道?也就是說,你是否想要一個描述管道的結構,然後爲每個輸入令牌實例化一次以運行它? –
是的,這就是我想到的。 – lizarisk