Вы должны использовать бесконечные циклы для эффективного повторного использования ручек сопрограммы? - PullRequest
0 голосов
/ 20 октября 2019

Учитывая следующий формат сопрограмм:

auto myhelper = [&]() -> mytask<int> {
  co_await some_event;
  co_return 5;
}();

Является ли следующий действительно единственный способ убедиться, что вы не получите перераспределения?

auto myhelper = [&]() -> mytask<int> {
  while (true) {
    co_await some_event;
    co_yield 5;
  }
}();

Поскольку я структурируювсе мои сопрограммы таким образом, и я даже не могу понять, приличный макрос или функция означает скрыть этот громоздкий цикл, ни шаблон в целом (то есть скобки после {}).

Я знаю,Пользовательские распределители обещают, но накладные расходы слишком велики (размер может варьироваться, все еще требуется проверка свободного списка, эффективное перераспределение и т. д.).

1 Ответ

1 голос
/ 20 октября 2019

Механизм сопрограммы на основе co_await разработан для очень специфического сценария использования: вы вызываете асинхронную операцию и приостанавливаете текущую функцию, планируя ее возобновление, когда асинхронная операция сгенерировала значение. Это основной вариант использования этой функции. Даже сценарии, основанные на генераторе, являются просто вырожденной формой этого, когда нет асинхронной операции, а механизм будущего / обещания дает вызывающей стороне возможность возобновить сопрограмму.

То, что вы делаете здесь, этоне ошибочно, в том смысле, что механизм сопрограмм позволяет вам выполнять многократное выполнение некоторой асинхронной операции в течение одного сопрограммного будущего. И если вы чувствуете, что это наиболее эффективный способ решения конкретной задачи, которую вы пытаетесь выполнить, вы можете использовать этот метод.

Но «переработка» ручек сопрограмм не совсем так, как системапредназначен для использования на всех. Дескрипторы означают для окончательного завершения. Они созданы, существуют какое-то время, ожидают выполнения некоторых операций, планируют их возобновление и завершаются. Это парадигма.

Таким образом, разработанное решение для вашей проблемы (избегая выделения памяти) - это предоставленный механизм распределения на основе обещаний. Вы чувствуете, что это недостаточно хорошо, и поэтому вы вынуждены использовать менее пикантные, более синтаксически уродливые механизмы. Как правило, это происходит, когда ваши потребности не совпадают с потребностями, предусмотренными проектом.

Это может быть просто случай, когда ваши потребности не удовлетворяются хорошо с сопрограммами приостановки типа co_await. ,Возможно, для вашего кода будет полезнее настоящее волокно.

...