liz*_*isk 1 c++ multithreading asynchronous pipeline dataflow
我正在尝试实现具有以下功能的多线程管道数据流框架:
流水线可以被描述为一个无环的有向图。每个节点执行一些处理并具有任意数量的任意类型的输入和一个任意类型的输出。
对于每个给定的输入数据实例,每个节点不应执行多次,之后应缓存结果。尽管此缓存不应该在内存中持续所需的时间更长,并且应该在任何其他节点不再需要时将其删除。
每个节点都应该支持惰性求值,即应该只在其他节点需要它的输出时才执行。
是否可以通过使用 C++11 多线程特性来实现这一点,尤其是std::future,std::promise和std::async? 任何人都可以提供线索吗?
我相信使用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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |