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" 答案。
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
文件)调用
_Launch
(xthread
文件)调用
_Thrd_startX
(xthread
文件)调用
_Thrd_start
(cthread.c
文件) 调用
_beginthreadex
(cthread.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
相比,它确实不足。我只会在性能对该项目无关紧要的情况下使用它。
Visual Studio 2015 年的 std::thread 是否在内部基于 PPL 的任务系统实施?
我的问题的背景是,对多个任务使用 std::thread 是否有意义,因为它们已经在公共线程池上平衡执行,还是通过 PPL 任务执行任务更好?
根据 (Which std::async implementations use thread pools?) 这似乎是,但由于问题相当陈旧,我想得到一个 "official" 答案。
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 的堆栈跟踪,请参阅
是也不是
对于 std::thread
:
std::thread
构造函数(thread
文件)调用
_Launch
(xthread
文件)调用
_Thrd_startX
(xthread
文件)调用
_Thrd_start
(cthread.c
文件) 调用
_beginthreadex
(cthread.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
相比,它确实不足。我只会在性能对该项目无关紧要的情况下使用它。