Механизм сопрограммы на основе co_await
разработан для очень специфического сценария использования: вы вызываете асинхронную операцию и приостанавливаете текущую функцию, планируя ее возобновление, когда асинхронная операция сгенерировала значение. Это основной вариант использования этой функции. Даже сценарии, основанные на генераторе, являются просто вырожденной формой этого, когда нет асинхронной операции, а механизм будущего / обещания дает вызывающей стороне возможность возобновить сопрограмму.
То, что вы делаете здесь, этоне ошибочно, в том смысле, что механизм сопрограмм позволяет вам выполнять многократное выполнение некоторой асинхронной операции в течение одного сопрограммного будущего. И если вы чувствуете, что это наиболее эффективный способ решения конкретной задачи, которую вы пытаетесь выполнить, вы можете использовать этот метод.
Но «переработка» ручек сопрограмм не совсем так, как системапредназначен для использования на всех. Дескрипторы означают для окончательного завершения. Они созданы, существуют какое-то время, ожидают выполнения некоторых операций, планируют их возобновление и завершаются. Это парадигма.
Таким образом, разработанное решение для вашей проблемы (избегая выделения памяти) - это предоставленный механизм распределения на основе обещаний. Вы чувствуете, что это недостаточно хорошо, и поэтому вы вынуждены использовать менее пикантные, более синтаксически уродливые механизмы. Как правило, это происходит, когда ваши потребности не совпадают с потребностями, предусмотренными проектом.
Это может быть просто случай, когда ваши потребности не удовлетворяются хорошо с сопрограммами приостановки типа co_await
. ,Возможно, для вашего кода будет полезнее настоящее волокно.