Информация об изменениях

Сообщение Re[5]: Вопрос по корутинам от 26.08.2025 9:26

Изменено 26.08.2025 9:34 rg45

Re[5]: Вопрос по корутинам
Здравствуйте, kov_serg, Вы писали:

R>>Так корутины (сопрограммы) именно такими и являются — последовательно исполняемыми. Никаких разных тредов и вызовов где попало здесь нет. Пока одна сопрограмма выполняется, другая ожидает (suspended). Отличие лишь в количестве "квантов".


_>Дело не в названии а в принипе работы. Кто определяет когда функция продолжит исполнение, кто следит за ресурсами, которые функции использует, какие гарантии, какие инварианты необходимо соблюдать для таких открытых функций?

_>Где это описано для корутин? Обычно нигде.

И я что-то не очень понимаю, о каких гарантиях ты говоришь.

Например, каких гарантий тебе не хватает в примере ниже?

http://coliru.stacked-crooked.com/a/efdfae5790ff2b9e

#include <concepts>
#include <generator>
#include <iostream>

template <std::incrementable T> 
std::generator<const T&> lazy_sequence(T t, size_t count) {
    for (size_t i = 0; i < count; ++i)
        co_yield t++;
}
 
int main()
{
    for (auto t : lazy_sequence('A', 26))  // -> A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
        std::cout << t << ' '; 
}
Re[5]: Вопрос по корутинам
Здравствуйте, kov_serg, Вы писали:

R>>Так корутины (сопрограммы) именно такими и являются — последовательно исполняемыми. Никаких разных тредов и вызовов где попало здесь нет. Пока одна сопрограмма выполняется, другая ожидает (suspended). Отличие лишь в количестве "квантов".


_>Дело не в названии а в принипе работы. Кто определяет когда функция продолжит исполнение, кто следит за ресурсами, которые функции использует, какие гарантии, какие инварианты необходимо соблюдать для таких открытых функций?

_>Где это описано для корутин? Обычно нигде.

И я что-то не очень понимаю, о каких гарантиях ты говоришь.

Например, каких гарантий тебе не хватает в примере ниже?

http://coliru.stacked-crooked.com/a/8c7737e8d549bffb

#include <concepts>
#include <generator>
#include <iostream>

template <std::incrementable T> 
std::generator<const T&> lazy_sequence(T t, size_t count) {
    for (size_t i = 0; i < count; ++i)
        co_yield t++;
}
 
int main()
{
    for (auto t : lazy_sequence(1, 10))  // -> 1 2 3 4 5 6 7 8 9 10 
        std::cout << t << ' '; 

    std::cout << std::endl;

    for (auto t : lazy_sequence('A', 26))  // -> A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
        std::cout << t << ' '; 
}