2016-04-28 61 views
3

Visual Studio 2015的std :: thread在內部基於PPL的任務系統實現嗎?Windows std :: thread在內部使用PPL嗎?

我的問題的背景是,對於幾個任務使用std :: thread是否有意義,因爲它們已經在公共線程池上執行了均衡,還是通過PPL任務執行任務更好?

根據(Which std::async implementations use thread pools?)這似乎是,但因爲這個問題已很舊,我想獲得一個「官方」的答案。

+0

它使用與PPL(即併發運行時)相同的基礎。它幾乎是完全取代了操作系統原語,重點是在多核CPU上實現更好的擴展。我懷疑有一天它會被移植到某種程度上的閒置希望。調試btw並不是一件好事。 std :: thread是一個相當普通的類,使用PPL來增加它。像線程池,parallel_for等等。 –

回答

6

是和std::thread

號:這就要求
_Thrd_startXxthread文件)
std::thread構造(thread文件)調用
_Launchxthread文件),其中要求
_Thrd_startcthread.c文件),它請撥打
_beginthreadexcthread.c文件)。

我沒有_beginthreadex代碼,但該文件在atlbase.h,一些Microsoft開發人員離開了以下評論:

// _beginthreadex calls CreateThread which will set the last error 
// value before it returns. 


所以沒有PPL involed。

但是,std::async在scens後面調用concurrency::create_task,然後它將使用基於windows API的線程池。

我的問題的背景是,是否有意義使用std::thread幾個任務...?

我已經使用卡薩布蘭卡它使用PPL。我也用PPL作爲獨立遊戲。
我完全不喜歡它。我自己的線程池+ std::future + std::promise字面上比concurrency::task對象更快速地被處理。它實際上與C#版本TPL不兼容。如果性能對該項目無關緊要,我只會使用它。

6

From the horse's mouth

我們重新實現了STL的多線程原語,以避免使用 併發運行時(ConcRT)。在2012年的 時間使用ConcRT是一個不錯的主意,但事實證明它比它的價值更麻煩。現在 我們使用的Windows API直接

IIRC,PPL也基於ConcRT,但這並不意味着標準庫建在PPL的頂部。他們並排存在。請參閱this question以獲取在std::thread下捕獲ConcRT的堆棧跟蹤。看不到PPL。

相關問題