Visual Studio 2015的std :: thread是否在内部基于PPL的任务系统实现?
我的问题的背景是,将std :: thread用于多个任务是否有意义,因为它们已经在公共线程池上执行了平衡,或者通过PPL任务执行任务更好?
根据(Which std::async implementations use thread pools?)这似乎是,但由于问题相当陈旧,我想得到一个"官员"答案。
答案 0 :(得分:6)
我们重新实现了STL的多线程原语以避免使用 并发运行时(ConcRT)。使用ConcRT是个好主意 时间(2012年),但事实证明它比它的价值更麻烦。现在 我们直接使用Windows API
IIRC,PPL也是基于ConcRT,但这并不意味着标准库是建立在PPL之上的。它们并存。有关在std::thread
下捕获ConcRT的堆栈跟踪,请参阅this question。看不到PPL。
答案 1 :(得分:6)
是和否。
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的线程池。
我的问题的背景是,将
std::thread
用于多项任务是否有意义??
我使用过使用PPL的卡萨布兰卡。我也和PPL一起独立玩。我根本不喜欢它。我自己的线程池+ std::future
+ std::promise
的字面数比concurrency::task
个对象快得多。它真的不符合C#版本TPL
。如果性能与该项目无关,我只会使用它。