c++ - 使用 C++11 异步功能的管道数据流

标签 c++ multithreading asynchronous pipeline dataflow

我正在尝试实现具有以下功能的多线程管道数据流框架:

  1. 管道可以描述为非循环有向图。每个节点执行一些处理,并具有任意数量的任意类型的输入和一个任意类型的输出。

  2. 对于每个给定的输入数据实例,每个节点不应执行多次,之后应缓存结果。尽管此缓存在内存中的保留时间不应超过所需的时间,并且应在任何其他节点不再需要时将其删除。

  3. 每个节点都应该支持惰性求值,即应该仅在另一个节点需要其输出时才执行。

是否可以使用 C++11 多线程功能来实现此功能,尤其是 std::futurestd::promisestd::async ?有人可以提供线索吗?

最佳答案

我相信使用async框架实际上是相当简单的。

如果你看std::launch你会意识到有一个延迟模式:

  • std::launch::deferred:任务在第一次请求其结果时在调用线程上执行(惰性求值)

因此,您可以启动任务并仅在需要结果时才执行它。但是,由于您提到了非循环图,您可能希望共享结果: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();
}

关于c++ - 使用 C++11 异步功能的管道数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17729437/

相关文章:

c++ - 捕获 boost 线程中断和退出线程的正确方法

c - Pthread不执行函数

javascript - 实现 getOrCreate 方法异步问题

c++ - 使用 '->' 运算符时保留访问权限

c++ - C++ initializer_list迭代器返回错误值

c++ - 如何使用 result_of 代替 decltype?

java - java中同步块(synchronized block)的部分执行

javascript - 为什么 script 标签的 document.write 有时间延迟?为什么脚本标签执行延迟?

具有异步方法调用的 Java 服务

c++ - 如何从 vector 中删除 shared_ptr