std :: async - использование зависит от реализации? - PullRequest
12 голосов
/ 20 февраля 2012

Я думал о std::async и о том, как его использовать в будущей реализации компилятора.Тем не менее, сейчас я немного застрял в чем-то похожем на недостаток дизайна.

std::async в значительной степени зависит от реализации, возможно с двумя вариантами launch::async, один из которых запускает задачу вновый поток и тот, который использует пул потоков / планировщик задач.

Однако, в зависимости от того, какой из этих вариантов используется для реализации std::async, использование будет сильно различаться.

Для варианта, основанного на «пуле потоков», вы сможете запускать множество небольших задач, не беспокоясь о накладных расходах, однако, что если одна из задач в какой-то момент заблокируется?

С другой стороны, вариант «Запустить новый поток» не будет иметь проблем с блокировкой задач, с другой стороны, издержки запуска и выполнения задач будут очень высокими.

пул потоков: + низкие издержки, -не всегда блокировать

запуск нового потока: + штраф с блоками, -высокие издержки

Так что в основномв зависимости от реализации, то, как мы используем std::async, будет очень осторожным.Если у нас есть программа, которая хорошо работает с одним компилятором, она может ужасно работать на другом.

Это так задумано?Или я что-то упустил?Считаете ли вы это, как и я, большой проблемой?

В текущей спецификации я пропускаю что-то вроде std::oversubscribe(bool), чтобы включить зависящее от реализации использование std::async.

РЕДАКТИРОВАТЬ: Насколько я читал, стандартный документ C ++ 11 не дает никаких указаний относительно того, могут ли задачи, отправленные на std::async, блокировать или нет.

Ответы [ 2 ]

11 голосов
/ 20 февраля 2012

std::async задачи, запущенные с политикой std::launch::async, запускаются «как в новом потоке», поэтому пулы потоков на самом деле не поддерживаются - среде выполнения придется сносить и заново создавать все локальные переменные потокамежду выполнением каждой задачи, что непросто.

Это также означает, что можно ожидать, что задачи, запущенные с политикой std::launch::async, будут выполняться одновременно.Может быть задержка запуска и переключение задач, если у вас больше запущенных потоков, чем процессоров, но они должны быть запущены, а не тупиковой, просто потому, что один ожидает другого.

Anреализация может выбрать расширение , которое позволяет вашим задачам запускаться в пуле потоков, и в этом случае именно эта реализация документирует семантику.

1 голос
/ 20 февраля 2012

Я ожидаю, что реализации запустят новые потоки и оставят пул потоков для будущей версии C ++, которая его стандартизирует.Существуют ли какие-либо реализации, использующие пул потоков?


MSVC изначально использовала пул потоков на основе их среды выполнения с параллелизмом.Согласно исправлениям STL В VS 2015, часть 2 это было удалено.Спецификация C ++ оставляла место для разработчиков, чтобы делать умные вещи, однако я не думаю, что это оставило достаточно места для этой реализации пула потоков.В частности, я думаю, что спецификация все еще требует, чтобы thread_local объекты были разрушены и перестроены, но пул потоков с ConcRT не поддержал бы это.

...