Re[7]: Вопрос по корутинам
От: rg45 СССР  
Дата: 26.08.25 10:35
Оценка:
Здравствуйте, kov_serg, Вы писали:

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

_>Простой вопрос кто должен выделять и освободлать ресурсы исполнитель или прораб тот кто поставил задачу должен предоставить ресурсы для её выполнения?

Ты сомневаешься, что вызываемая корутина корректно завершает время жизни своего внутреннего состояния? На счёт этого можешь быть спокоен (см. пример ниже). А с точки зрения вызывающей функции процесс практически тот же самый, что и при многократном вызове обычной функции. Просто для передачи управления используеся новое словечко co_await.

http://coliru.stacked-crooked.com/a/9e5ecbe772104372

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

class life_time_indicator
{
public:
    life_time_indicator(const std::string id) : id(id) { std::cout << id << " constructed" << std::endl; }
    ~life_time_indicator() { std::cout << id << " destructed" << std::endl; }

    life_time_indicator(const life_time_indicator&) = delete;
    life_time_indicator& operator = (const life_time_indicator&) = delete;

private:
    std::string id;    
};

template <std::incrementable T> 
std::generator<const T&> infinite_sequence(T t, const std::string& id) {
    life_time_indicator indicator{id};
    
    for (;;)
        co_yield t++;
}
 
int main()
{
    for (auto t : infinite_sequence(1, "Numbers")) {
        std::cout << t << ' '; 
        if (t == 10)
            break;
    }
    std::cout << std::endl;

    for (auto t : infinite_sequence('A', "Letters")) {
        std::cout << t << ' '; 
        if (t == 'Z')
            break;
    }
    std::cout << std::endl;
}

Numbers constructed
1 2 3 4 5 6 7 8 9 10 Numbers destructed

Letters constructed
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 Letters destructed
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 26.08.2025 11:16 rg45 . Предыдущая версия . Еще …
Отредактировано 26.08.2025 11:12 rg45 . Предыдущая версия .
Отредактировано 26.08.2025 11:11 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.