Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Всё остальное — это искажения термина и лишь ещё один интерфейс для Thread Pool. Быстрый поиск выдаёт, что в MSVС реализовали таки через треды, что неудивительно.
Пробежал глазами упомянутое предложение, не увидел упоминания о потоках, как контролировать всю подноготную runtime в этом контексте.
co_await возвращает просто future, а кто ставит в нее результат уже не важно будь то какое-нибудь асинхронное API ОС например.Всё остальное — это искажения термина и лишь ещё один интерфейс для Thread Pool.
Похоже MS форсит свою реализацию, даже в свой компилятор поддержку добавили.Это у них в ДНК.
This work is the result of collaboration of researchers in industry and academia, including CppDes Microsoft
group and the WG21 study group SG1. We wish to thank people who made valuable contributions within
and outside these groups, including Jens Maurer, Artur Laksberg, Chandler Carruth, Gabriel Dos Reis, Deon
Brewis, Jonathan Caves, James McNellis, Stephan T. Lavavej, Herb Sutter, Pablo Halpern, Robert Schumacher,
Michael Wong, Niklas Gustafsson, Nick Maliwacki, Vladimir Petter, Shahms King, Slava Kuznetsov,
Tongari J, Lawrence Crowl, and many others not named here who contributed to the discussion
Сопрограммы в стиле C# await — во многом результат простого копирования синтаксиса из других языков. Скопировали и запустили в работу. При этом были скопированы и ошибки и недостатки сопрограмм из этих языков (C#, Python).
типо std_await
Мне как пользователю Python который часто мучает Tornado и Asyncio всё кажется логичным.А мне, как пользователю C++ «на железе» — ни разу.
А мне, как пользователю C++ «на железе» — ни разу.
Как это взаимодествует с `__thread`? А с `tgkill`/`sigaction`? Что мне потребуется сделать в RTEMS чтобы это использовать? Ах, вы не знаете и вас это не волнует — ну это ваш выбор. Только не суйте это сырое и недодуманное поделие в стандарт.
Одно дело — сделать фичу, которая реализуется в виртуальной машине поверх ограниченного рантайма, другое — придумать нечто, что должно работать на всём, начиная со стиральных машин и марсоходов, и кончая суперкомпьютерами.
А мне, как пользователю C++ «на железе» — ни разу.Ну и используйте C++14 дальше, С++17 никто не заставляет использовать.
«Думаете» или знаете? Или опять: «я хочу эту фичу, что будете делать вы — меня не волнует?»Как это взаимодествует с `__thread`? А с `tgkill`/`sigaction`? Что мне потребуется сделать в RTEMS чтобы это использовать? Ах, вы не знаете и вас это не волнует — ну это ваш выбор. Только не суйте это сырое и недодуманное поделие в стандарт.Думаю особых проблем с этим не будет.
Именно там асинхроность очень часто встречается. Тут же просто синтаксический сахар, что бы избежать callback-hell.Если это «просто синтаксический сахар», то почему это вдруг требует изменений в компилятор вообще? А если это не «синтаксический сахар», то почему вы так уверены, что с другими вещами это предложение не будет конфликтовать?
Если это «просто синтаксический сахар», то почему это вдруг требует изменений в компилятор вообще? А если это не «синтаксический сахар», то почему вы так уверены, что с другими вещами это предложение не будет конфликтовать?Вот потому оно и требует изменений в компиляторе, что является синтаксическим сахаром.
«Думаете» или знаете? Или опять: «я хочу эту фичу, что будете делать вы — меня не волнует?»Я — знаю. Я занимался обратным портированием этой фичи в C# на фреймворк 2.0 когда только-только вышел Async CTP. Фича реализуется пользостью переносимым кодом.
Нифига себе заявочки. Хорошо что не вы эту фичу пытаетесь в комитет по стандартизации продвигать. Потому что одно такое заявление само по себе было бы достаточно чтобы фичу «зарубить» раз и навсегда. Независимо от каких-либо других аргументов.
Ах, вы не знаете и вас это не волнует — ну это ваш выбор.
«Думаете» или знаете? Или опять: «я хочу эту фичу, что будете делать вы — меня не волнует?»
По‐моему, это очевидно: предложение «не использовать C++17 на …» при предложении нового функционала для включения в стандарт означает предложение остановить разработку языка на …, потому что следующий стандарт языка основывается на предыдущем. На такую заморозку никто не пойдёт. Предложение сделать функционал необязательным для компиляторов было бы более адекватным.Почему?Ну и используйте C++14 дальше, С++17 никто не заставляет использовать.Нифига себе заявочки. Хорошо что не вы эту фичу пытаетесь в комитет по стандартизации продвигать. Потому что одно такое заявление само по себе было бы достаточно чтобы фичу «зарубить» раз и навсегда. Независимо от каких-либо других аргументов.
Собственно и khim мог бы просто не использовать async, что бы не боятся на счёт совместимости своих подходов к разработке и технологиями.Если я разрабатываю платформу? Как вы это себе представляете?
Если я разрабатываю платформу? Как вы это себе представляете?
Скажите что ваша платформа не поддерживает эту фичу.автоматически трактуются как
Предлагаемая мною классная фича для включения в стандарт — не готова.О чём, собственно, авторы обсуждаемой статьи и говорят: если ваша фича кому-то может помочь, а кому-то — не нужна совершенно значит ей в стандарте C++17 делать нечего.
А основной стандарт — един. Опциональные фишки в нём — это признания того, что что-то было в него включено по ошибке (VLA-массивы в C11, export шаблонов в C++11).
О чём, собственно, авторы обсуждаемой статьи и говорят: если ваша фича кому-то может помочь, а кому-то — не нужна совершенно значит ей в стандарте C++17 делать нечего.
То есть если мне нужно загрузить н ресурсов из сети, мне придется это делать поочереди?
Список поддерживаемых архитектур довольно скуден.А чего вам не хватает? Sparc'а? Itanic'а? Для них кто-то что ещё разрабатывает?
Сохранение стэка с регистрами никогда не заработает для экзотических платформ, типа Emscripten (компиляция C++ в asm.js).А на этих «экзотических платформах» реально кто-то что-то пишет? И кто, собственно, помешает вам реализовать поддержку соответствующий абстракций для них? Тот же Emscripten эмулирует всё на свете поверх одного массива — совершенно непонятно что может помешать реализовать Boost.Context для него. Ну кроме отсутствия необходимости, тут всё понятно.
2) Boost.Context не решает проблему «параллельности» стандартной библиотеки.Что вы имеете в виду? Вы вполне можете использовать стандартную библиотеку с Boost.Context — кто вам помешает.
В любом случае поддержать их можно — было бы желание.
А на этих «экзотических платформах» реально кто-то что-то пишет?
И кто, собственно, помешает вам реализовать поддержку соответствующий абстракций для них? Тот же Emscripten эмулирует всё на свете поверх одного массива — совершенно непонятно что может помешать реализовать Boost.Context для него.
Поддержать на уровне буста? То есть вместо того, чтобы поддерживать на уровне рантайма и компилятора будем для каждой пары компилятор-платформа добавлять что-то в буст? Как по мне это путь в никуда.Ну если миллиарды устройств и пользователей это для вас «никуда» — тогда да, наверное.
Представьте себе да. Точнее это одна из платформ, под которую собирается код.И? Код можно собрать и под PDP-10 и под C64. Вот недавно какую вещь написали для CGA написали. Причём тут Boost и C++11/14/17? Будем теперь ради двух с половиной разработчиков всех остальных заставлять делать невесть что?
И если вдруг подход поменяется (например, в сторону JS objects как у альтернатив), то внезапно все перестанет работать.Ну значит у пользователей возникнет вопрос: то ли отказаться от «супер-пупер» версии Emscripten'а, либо от Boost.Context.
Собственно в этом и есть главный изъян подхода, когда библиотека берет на себя platform-specific вещи.Что совершенно не значит, что этот подход не имеет права к существованию. Вот тут советуют обратить внимание на председателя SG1. Рекомендую вам это сделать, а потом подумать где вы слышали это имя.
Ну если миллиарды устройств и пользователей это для вас «никуда» — тогда да, наверное.
И? Код можно собрать и под PDP-10 и под C64.
двух с половиной разработчиков
мертворождённое творение типа Emscripten'а
чтобы ради неё корёжить стандарты
И? Код можно собрать и под PDP-10 и под C64.
Собирается и успешно работает.
чтобы ради неё корёжить стандарты
Пользователи других языков с async/await не считают, что их языки покорежили. Поддержка таких вещей как асинхронность, рефлексия и прочее без помощи рантайма никогда не будет эффективной, и рано или поздно появится.
Но стоит мне присобачить к моей железяке аппаратный генератор случайных чисел, который «всегда готов» — и всё, процедура пересылки случайных данных в последовательный порт займёт процесср — и уже никому его не отдаст.Значит, надо всего лишь добавить задержку. Или вставить в цикл инструкцию принудительного переключения контекста (в js такое делается согласно стандарту Promises/A+ для любого продолжения, в C# это делается через await Task.Yield() — значит и для C++ решение найдется).
Зачит, надо всего лишь добавить задержку. Или вставить в цикл инструкцию принудительного переключения контекста (в js такое делается согласно стандарту Promises/A+ для любого продолжения, в C# это делается через await Task.Yield()).Но в предложении от Microsoft ничего такого нету! И в реализации нету! Ни короутин (то, что там называется короутиными реализовано через волокна — механизм, существующий только в Windows), ни поддержки потоков, ни многого другого!
значит и для C++ решение найдетсяВот когда оно найдётся — тогда и будет пора включить предложение в стандарт.
Ну нахера там поддержка потоков-то?Потому что начиная с C++11 в C++ есть поддержка потоков. И, стало быть, любое предложение расширения языка обязано это учитывать. В том числе объяснять — как это всё будет работать на платформах, где «волокон» нету.
а потом задавать вопросы вроде «как оно будет работать на платформах без настоящих потоков»?Потому что на таких платформах C++ тоже активно используется.
Вот именно потому что там нет ни слова про потоки — оно и будет без потоков превосходно работать!Снова «я Пастернака не читал, но осуждаю»? Или, как в данном случае, «поддерживаю»? Не будет оно работать. В обсуждаемом документе подробно написано — почему то, что предложено, работать не будет и почему то, что реализовано таки работает (за счёт вполне определённой реализации на вполне определённой платформе).
Но, видимо, что-то важное пересказать автор забыл.Автор, собственно, техническую часть опустил с замечанием «Честно говоря, мне этот пункт показался несколько притянутым. Во всяком случае отдельные детали реализации могут быть исправлены и принципиальных недостатков, присущих модели, не видно.»
Но обсуждается-то не модель с её «принципиальными недостатками», а конкретное предложение!
я думал, тут его перевод-пересказ опубликован
Все приведенные замечания были учтены, и для новой версии уже неактуальны.
5) Риск для безопасности и производительности: текущий дизайн сопрограмм увеличивает риск jitter'a, недостатка ресурсов отдельным задачам (starvation) и DOS атаки.
( await-ready-expr
? await-resume-expr
: (await-suspend-expr, suspend-resume-point, await-resume-expr))this essentially means that if the Awaitable is already ready (await_ready returns true) the coroutine continues without suspending. And so on and so on for an indefinite number of iterations. This can at best result in high jitter; and at worst starvation.
The await-expression evaluates the await-ready expression, then:
— If the result is true, or when the coroutine is resumed, the await-resume expression is evaluated, and its result is the result of the await-expression.
Значит, надо всего лишь добавить задержку. Или вставить в цикл инструкцию принудительного переключения контекста (в js такое делается согласно стандарту Promises/A+ для любого продолжения, в C# это делается через await Task.Yield() — значит и для C++ решение найдется)
spawn(always_suspend, some_async_function); spawn(always_continue, some_async_function);New coroutine-based threads of execution are explicitly launched using a spawn function. This function also allows the user to specify the execution properties of the new thread of execution.
5.2. Introducing new threads of execution should be explicit
As mentioned above, coordinating multiple threads of execution is a requirement of all but the most trivial applications. Even if a networking application is single-threaded, there still exists concurrency in the scheduling and execution of these threads of execution. Therefore, to reduce the risk of programmer error, the introduction of new threads of execution should be explicit.
In this proposal, new coroutine-based threads of execution are initiated using the spawn function. In addition to launching a new thread of execution, this function requires the programmer to specify the executor that will be used for it.
co_yield — а механизм await_transform.std::future<void> tcp_sender(std::vector<std:string> msgs)
{
auto conn = await Tcp::Connect("127.0.0.1”, 1337);
std::for_each(msgs.begin(), msgs.end(),
[&conn](const std::string& msg)
{
await conn.write(msg.data(), msg.size());
});
}template <class I, class F>
std::future<void> resumable_for_each(I begin, I end, F f)
{
for (I iter = begin; iter != end; ++iter)
await f(*iter);
}
std::future<void> tcp_sender(std::vector<std:string> msgs)
{
auto conn = await Tcp::Connect("127.0.0.1”, 1337);
resumable_for_each(msgs.begin(), msgs.end(),
[&conn](const std::string& msg)
{
await conn.write(msg.data(), msg.size());
});
}
Возражения против принятия Coroutines с await в C++17