5

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

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

根据(which std::async implementations use thread pools?)这似乎是,但由于这个问题相当老,我想得到一个“官方”的答案。

4

2 回答 2

6

是和否。

for std::thread
std::thread构造函数(threadfile)调用
_Launchxthreadfile)调用
_Thrd_startXxthreadfile)调用
_Thrd_startcthread.cfile)调用
_beginthreadexcthread.cfile)。

我没有_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。如果性能对那个项目不重要,我只会使用它。

于 2016-04-28T12:39:35.747 回答
6

从马口中

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

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

于 2016-04-28T12:28:50.487 回答