Windows std :: thread是否在内部使用PPL?

时间:2016-04-28 12:06:27

标签: c++ multithreading c++11 ppl

Visual Studio 2015的std :: thread是否在内部基于PPL的任务系统实现?

我的问题的背景是,将std :: thread用于多个任务是否有意义,因为它们已经在公共线程池上执行了平衡,或者通过PPL任务执行任务更好?

根据(Which std::async implementations use thread pools?)这似乎是,但由于问题相当陈旧,我想得到一个"官员"答案。

2 个答案:

答案 0 :(得分:6)

From the horse's mouth

  

我们重新实现了STL的多线程原语以避免使用   并发运行时(ConcRT)。使用ConcRT是个好主意   时间(2012年),但事实证明它比它的价值更麻烦。现在   我们直接使用Windows API

IIRC,PPL也是基于ConcRT,但这并不意味着标准库是建立在PPL之上的。它们并存。有关在std::thread下捕获ConcRT的堆栈跟踪,请参阅this question。看不到PPL。

答案 1 :(得分:6)

是和否。

std::thread


std::thread构造函数(thread文件)调用
调用
_Launchxthread文件)  调用
_Thrd_startXxthread文件)  调用
_Thrd_startcthread.c文件)  _beginthreadexcthread.c档案)。

我没有_beginthreadex代码,但在文件atlbase.h中,一些微软开发人员留下了以下评论:

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

所以没有PPL发布。

但是,std::async在后​​面调用concurrency::create_task,然后它将使用基于Windows API的线程池。

  

我的问题的背景是,将std::thread用于多项任务是否有意义??

我使用过使用PPL的卡萨布兰卡。我也和PPL一起独立玩。我根本不喜欢它。我自己的线程池+ std::future + std::promise的字面数比concurrency::task个对象快得多。它真的不符合C#版本TPL。如果性能与该项目无关,我只会使用它。