Search code examples
c++multithreadingc++11ppl

Does Windows std::thread uses internally PPL?


Is the implementation of Visual Studio 2015's std::thread internally based on PPL's task system?

The background of my question is, does it make sense to use std::thread for several tasks, because they are already executed balanced on the common threadpool, or is it better to execute the tasks via PPL tasks?

According to (Which std::async implementations use thread pools?) this seems to be, but since the question is rather old I would like to get an "official" answer.


Solution

  • Yes and No.

    for std::thread:
    std::thread constructor (thread file) calls
    _Launch (xthread file) which calls
    _Thrd_startX (xthread file) which calls
    _Thrd_start(cthread.c file) which calls
    _beginthreadex (cthread.c file).

    I don't have _beginthreadex code, but in the file atlbase.h, some microsoft developer left the following comment :

    // _beginthreadex calls CreateThread which will set the last error
    // value before it returns.
    


    so no PPL involed.

    But, std::async calls concurrency::create_task behind the scens, and then it will use the windows API based thread pool.

    The background of my question is, does it make sense to use std::thread for several tasks...?

    I have used Casablanca which uses PPL. I also played with PPL as standalone.
    I don't like it at all performance wise. my own threadpool + std::future + std::promise were literally houndered times faster than concurrency::task objects. It is really falls short against the C# version TPL. I would only use it if performace does not matter for that project.