Использует ли Windows std::thread внутренне PPL?
Является ли реализация Visual Studio 2015 std:: thread внутренне на основе системы задач PPL?
Исходная информация моего вопроса такова: имеет ли смысл использовать std:: thread для нескольких задач, потому что они уже выполнены сбалансированно в общем пуле потоков, или лучше выполнять задачи через задачи PPL?
Согласно ( Какие реализации std:: async используют пулы потоков?), Похоже, что это так, но поскольку вопрос довольно старый, я бы хотел получить "официальный" ответ.
2 ответа
И да и нет.
за std::thread
:std::thread
конструктор (thread
файл) звонки_Launch
(xthread
файл) который вызывает_Thrd_startX
(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.
Но, std::async
звонки concurrency::create_task
за кулисами, а затем он будет использовать пул потоков на основе Windows API.
Подоплекой моего вопроса является, имеет ли смысл использовать
std::thread
для нескольких задач...?
Я использовал Касабланку, которая использует PPL. Я также играл с PPL как автономным.
Мне вообще не нравится производительность. мой собственный пул потоков std::future
+ std::promise
были буквально уложены в разы быстрее, чем concurrency::task
объекты. Это действительно не соответствует версии C# TPL
, Я бы использовал его, только если производительность не имеет значения для этого проекта.
Мы повторно реализовали многопоточные примитивы STL, чтобы избежать использования Concurrency Runtime (ConcRT). Использование ConcRT было хорошей идеей в то время (2012), но оказалось, что это было больше проблем, чем оно того стоило. Теперь мы используем Windows API напрямую
IIRC, PPL также был основан на ConcRT, но это не означает, что Стандартная библиотека была построена поверх PPL. Они существовали бок о бок. Посмотрите этот вопрос для трассировки стека, которая захватывает ConcRT под std::thread
, Нет PPL в поле зрения.