2016-04-28 86 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。

相关问题