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

Does Windows std::thread uses internally PPL?

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

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

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

From the horse's mouth :

We’ve reimplemented the STL’s multithreading primitives to avoid using the Concurrency Runtime (ConcRT). Using ConcRT was a good idea at the time (2012), but it proved to be more trouble than it was worth. Now we’re using the Windows API directly

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

是也不是

对于 std::thread:
std::thread 构造函数(thread 文件)调用
_Launchxthread 文件)调用
_Thrd_startXxthread 文件)调用
_Thrd_start(cthread.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 的线程池。

The background of my question is, does it make sense to use std::thread for several tasks...?

我用过使用PPL的卡萨布兰卡。我还单独玩过 PPL。
我一点也不喜欢它的性能。我自己的线程池 + std::future + std::promise 实际上比 concurrency::task 对象快几倍。与 C# 版本 TPL 相比,它确实不足。我只会在性能对该项目无关紧要的情况下使用它。