Использует ли 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 в поле зрения.

Другие вопросы по тегам