2013-07-18 37 views
0

我试图实现一个多线程的管道数据流框架,具有以下特点:管道数据流设有

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

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

  3. 每个节点都应该支持延迟评估,即只应在某个其他节点需要输出时才执行。

是否有可能通过使用C++多线程11功能,特别是std::futurestd::promisestd::async来实现这一点?任何人都可以提供线索吗?

+0

是否有可能重新使用管道?也就是说,你是否想要一个描述管道的结构,然后为每个输入令牌实例化一次以运行它? –

+0

是的,这就是我想到的。 – lizarisk

回答

2

我相信这实际上是使用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(); 
} 
+0

谢谢你的回答!虽然不清楚应该如何处理不同的输入令牌,以及如何在不再需要时清除存储的值(即,在将执行传递到后续阶段后应该清除内存的顺序管道中)。 'shared_future'应该以某种方式实例化,并在图本身内传递,而不是作为全局变量。不知道如何做到这一点。 – lizarisk