Я думал о std::async
и о том, как его использовать в будущей реализации компилятора.Тем не менее, сейчас я немного застрял в чем-то похожем на недостаток дизайна.
std::async
в значительной степени зависит от реализации, возможно с двумя вариантами launch::async
, один из которых запускает задачу вновый поток и тот, который использует пул потоков / планировщик задач.
Однако, в зависимости от того, какой из этих вариантов используется для реализации std::async
, использование будет сильно различаться.
Для варианта, основанного на «пуле потоков», вы сможете запускать множество небольших задач, не беспокоясь о накладных расходах, однако, что если одна из задач в какой-то момент заблокируется?
С другой стороны, вариант «Запустить новый поток» не будет иметь проблем с блокировкой задач, с другой стороны, издержки запуска и выполнения задач будут очень высокими.
пул потоков: + низкие издержки, -не всегда блокировать
запуск нового потока: + штраф с блоками, -высокие издержки
Так что в основномв зависимости от реализации, то, как мы используем std::async
, будет очень осторожным.Если у нас есть программа, которая хорошо работает с одним компилятором, она может ужасно работать на другом.
Это так задумано?Или я что-то упустил?Считаете ли вы это, как и я, большой проблемой?
В текущей спецификации я пропускаю что-то вроде std::oversubscribe(bool)
, чтобы включить зависящее от реализации использование std::async
.
РЕДАКТИРОВАТЬ: Насколько я читал, стандартный документ C ++ 11 не дает никаких указаний относительно того, могут ли задачи, отправленные на std::async
, блокировать или нет.