std :: async - Использование в зависимости от реализации?

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

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

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

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

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

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

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

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

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

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

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

12
задан ronag 20 February 2012 в 15:12
поделиться