我是C++的新手,我來自Python的長篇背景。C++中的類似Python的多處理
我正在尋找一種在C++中並行運行函數的方法。我讀了很多關於std::async
的內容,但對我而言仍然不是很清楚。
下面的代碼做一些真正有趣的事情
#include <future> #include <iostream> void called_from_async() { std::cout << "Async call" << std::endl; } int main() { //called_from_async launched in a separate thread if possible std::future<void> result(std::async(called_from_async)); std::cout << "Message from main." << std::endl; //ensure that called_from_async is launched synchronously //if it wasn't already launched result.get(); return 0; }
如果我跑了好幾次,有時輸出是我所期待的:
Message from main. Async call
但有時我得到這樣的事情:
MAessysnacg ec aflrlom main.
爲什麼不是
cout
首先發生?我清楚地在cout
之後調用.get()
方法。關於平行運行。如果我有這樣的代碼:
#include <future> #include <iostream> #include <vector> int twice(int m) { return 2 * m; } int main() { std::vector<std::future<int>> futures; for(int i = 0; i < 10; ++i) { futures.push_back (std::async(twice, i)); } //retrive and print the value stored in the future for(auto &e : futures) { std::cout << e.get() << std::endl; } return 0; }
所有10個調用
twice
函數將在不同的內核上同時運行?如果不是,那麼在C++中是否有類似的東西,如Python 多進程 lib?
主要是什麼我正在尋找:
我寫一個函數,並與具有多輸入n個稱呼它?並且它將在n個節點上同時運行該功能1次。
因爲'std :: cout'是內部同步的,所以你的結果應該不會**發生。這實際上是你看到的確切結果嗎?如果是這樣,那是一個編譯器錯誤。 - 另一個評論,請不要將行號添加到您要發佈的代碼中,這會讓其他人難以複製並粘貼它來嘗試代碼。 –
至於** 1 **:你想要平行運行,然後當他們平行運行時你感到驚訝嗎? – Biffen
@Biffen在並行處理中,我並不感到驚訝,但是當你看到第一個'cout'並不平行時,並行處理只被稱爲ONCE和'cout'後。這是什麼讓人困惑 –