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