【问题标题】:Does Windows std::thread uses internally PPL?Windows std::thread 是否在内部使用 PPL?
【发布时间】:2016-08-23 04:30:54
【问题描述】:

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

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

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

【问题讨论】:

  • 它使用与 PPL 相同的基础,即并发运行时。它(几乎)完全替代了操作系统原语,重点是在多核 CPU 上获得更好的扩展性。而且我怀疑它会在某一天被移植的有点闲置的希望。顺便说一句,调试并不是一件好事。 std::thread 是一个相当简单的类,使用 PPL 来添加它。像线程池、parallel_for 等。

标签: c++ multithreading c++11 ppl


【解决方案1】:

From the horse's mouth

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

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

【讨论】:

    【解决方案2】:

    是和否。

    对于std::thread
    std::thread构造函数(thread文件)调用
    _Launchxthread文件)调用
    _Thrd_startXxthread文件)调用
    _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::promiseconcurrency::task 对象快了几倍。与 C# 版本 TPL 相比,它确实不足。如果性能对那个项目不重要,我只会使用它。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2011-11-06
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多