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