2012-11-04 20 views
2

我很感興趣,然後在PPL中構建的目的是什麼,我可以在哪裏測試它?看來Visual Studio 2012還不支持它(可能會有一些未來的CTP?)。它是否具有標準C++ 11異步庫中的等價物?PPL任務構建的目的是什麼?

+1

文件說了什麼? –

+0

Visual Studio 2012確實支持.then()和PPL,當你嘗試和使用它時,你看到了什麼問題? – mattnewport

回答

6

目的是讓您能夠表達必須按順序執行的異步任務。

例如,假設我在GUI應用程序中。當用戶按下按鈕時,我想異步啓動任務以在線檢索文件,然後對其進行處理以檢索某種數據,然後使用此數據更新GUI。發生這種情況時,還有很多其他任務正在進行,主要是爲了保持GUI的響應。

這可以通過使用調用回調的回調來完成。 與lambda相關聯的.then()功能允許您在其中實例化所有回調內容(如果需要,仍然可以使用單獨的回調)。 它也不能保證每個單獨任務的工作將由同一個線程完成,如果初始線程已經有太多工作要做,可以讓空閒線程竊取任務。

.then()函數在C++ 11中不存在,但建議添加到std :: future類(基本上是任務或任務結果的句柄)。

4

Klaim已經做出了很好的回答,但我想我會舉一個具體的例子。基本上,

.then附加一個延續到任務,並且是異步同步.get

C++ 11有std::future,這相當於concurrency::task。目前只有.get,but there is a proposal to add .then (and other good stuff)

std::async(calculate_answer(the_question_of_everything)) 
    .then([](std::future<int> f){ std::cout << f.get() << "\n"; }); 

上面的代碼將創建一個異步任務(std::async推出),然後安裝它獲取一旦上述任務完成後通過完成任務的std::future的延續。實際上這返回std::future任務,並且當前C++ 11標準將在其析構函數but there is another proposal to make the destructor unblocking上阻塞。因此,通過上面的代碼,您可以創建一個即開即用的任務,一旦計算出答案就會打印答案。

阻塞相當於是:

auto f = std::async(calculate_answer(the_question_of_everything)); 
std::cout << f.get() << "\n"; 

此代碼將在f.get()阻塞,直到答案可用。

+0

老問題,但你能解釋一下,爲什麼我不會把'calculate_answer(the_question_of_everything)'和'std :: cout << f.get()...'放到一個常見的函數/ lambda中異步啓動? – MikeMB

+0

@MikeMB:關注問題的分離,特別是因爲異步調用可能遠離您想要附加結果邏輯的地方。 – Xeo

相關問題