2013-07-18 98 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