Visual Studio 2015的std :: thread在内部基于PPL的任务系统实现吗?Windows std :: thread在内部使用PPL吗?
我的问题的背景是,对于几个任务使用std :: thread是否有意义,因为它们已经在公共线程池上执行了均衡,还是通过PPL任务执行任务更好?
根据(Which std::async implementations use thread pools?)这似乎是,但因为这个问题已很旧,我想获得一个“官方”的答案。
Visual Studio 2015的std :: thread在内部基于PPL的任务系统实现吗?Windows std :: thread在内部使用PPL吗?
我的问题的背景是,对于几个任务使用std :: thread是否有意义,因为它们已经在公共线程池上执行了均衡,还是通过PPL任务执行任务更好?
根据(Which std::async implementations use thread pools?)这似乎是,但因为这个问题已很旧,我想获得一个“官方”的答案。
是和std::thread
号:这就要求
_Thrd_startX
(xthread
文件)
std::thread
构造(thread
文件)调用
_Launch
(xthread
文件),其中要求
_Thrd_start
(cthread.c
文件),它请拨打
_beginthreadex
(cthread.c
文件)。
我没有_beginthreadex
代码,但该文件在atlbase.h
,一些Microsoft开发人员离开了以下评论:
// _beginthreadex calls CreateThread which will set the last error // value before it returns.
所以没有PPL involed。
但是,std::async
在scens后面调用concurrency::create_task
,然后它将使用基于windows API的线程池。
我的问题的背景是,是否有意义使用
std::thread
几个任务...?
我已经使用卡萨布兰卡它使用PPL。我也用PPL作为独立游戏。
我完全不喜欢它。我自己的线程池+ std::future
+ std::promise
字面上比concurrency::task
对象更快速地被处理。它实际上与C#版本TPL
不兼容。如果性能对该项目无关紧要,我只会使用它。
我们重新实现了STL的多线程原语,以避免使用 并发运行时(ConcRT)。在2012年的 时间使用ConcRT是一个不错的主意,但事实证明它比它的价值更麻烦。现在 我们使用的Windows API直接
IIRC,PPL也基于ConcRT,但这并不意味着标准库建在PPL的顶部。他们并排存在。请参阅this question以获取在std::thread
下捕获ConcRT的堆栈跟踪。看不到PPL。
它使用与PPL(即并发运行时)相同的基础。它几乎是完全取代了操作系统原语,重点是在多核CPU上实现更好的扩展。我怀疑有一天它会被移植到某种程度上的闲置希望。调试btw并不是一件好事。 std :: thread是一个相当普通的类,使用PPL来增加它。像线程池,parallel_for等等。 –