Павел Новиков - Учимся готовить C++ корутины на практике

Поділитися
Вставка
  • Опубліковано 15 чер 2021
  • Ближайшая конференция: С++ Russia 2024, 24 мая (online), 2-3 июня (offline, Москва)
    Подробности и билеты: jrg.su/W8skjE
    - -
    В С++20 появился мощный инструмент - корутины. Однако в данный момент в стандартной библиотеке C++ практически нет средств для удобной работы с корутинами «из коробки». Поэтому нужно научиться их готовить, чтобы использовать этот инструмент с пользой и эффективно. Этим мы и займёмся.
    Разберёмся, как использовать корутины с нуля для работы с асинхронными задачами.
  • Наука та технологія

КОМЕНТАРІ • 6

  • @sergeyvlasov207
    @sergeyvlasov207 Місяць тому

    Спасибо автору, постарался объяснить все четко. Но по факту, просто пришили сороконожке 41-ю ногу. А зачем? А чтобы было...

  • @cppprograms5868
    @cppprograms5868 3 роки тому +2

    Давайте делайте уроки по С++!!!

    • @DART2WADER
      @DART2WADER 3 роки тому +6

      Это к Константину Владимирову на канал.

  • @user-mt9cu8vw1p
    @user-mt9cu8vw1p 3 місяці тому

    Что за корутин и зачем он нужен не возможно понять из этих слов

  • @andy.1331
    @andy.1331 3 роки тому

    FinalAwaitable на 35-м слайде тоже _должен_ реализовать симметричную передачу управления приостановленной (или отсутствующей) корутине. Просто возвращайте всегда из метода FinalAwaitable::await_suspend значение promise.continuation
    Также непонятно зачем определять собственный оператор co_await для Task. Кстати, если в терминологии promise, то почему Task, а не future? Да ещё и с большой буквы. Разве C# для нас уже стал абсолютным источником замещения наших собственных творческих замыслов и правил С++? :-) Проще и понятнее сделать сам Task (или future) awaitable без переопределения оператора co_await. Тем более, что это действительно просто.
    Лучше, наверное, привести пример с использованием некоего пула потоков для реализации асинхронного выполения задачи, вместо того, чтобы говорить "я так сделал, но вы так никогда не делайте". Тем более, что для Windows это _вообще_ не проблема - для Linux не знаю, не использую

    • @PaulSkeptic
      @PaulSkeptic 3 роки тому

      Для *FinalAwaitable* теоретически можно было бы сделать симметричную передачу управления, но незачем, потому что *FinalAwaitable* используется только на завершении выполнения корутины, т.е. текущую корутину нет смысла возобновлять при симметричной передаче управления, потому что она по сути уже завершилась. Всегда возвращать *promise.continuation* нельзя, потому что продолжение не всегда является валидной корутиной (поэтому есть проверка перед возобновлением). Можно было бы возвращать *promise.continuation* _или_ *std::noop_coroutine()* при симметричной передаче управления, но это получаются приседания ради приседаний, профит такого подхода не понятен.
      Определение *operator co_await* - _самый простой_ способ (из по крайней мере трёх) сделать возможность ожидать объект какго-либо типа (т.е. звать *co_await* на таком объекте).