Сообщение Re[7]: Вопрос по корутинам от 26.08.2025 10:35
Изменено 26.08.2025 11:16 rg45
Re[7]: Вопрос по корутинам
Здравствуйте, kov_serg, Вы писали:
_>Это слишком простой пример. Тут никаких особых гарантий не надо, т.к. они не используют общих ресурсов и даже не выделяют их для выполнения зачачи.
_>Простой вопрос кто должен выделять и освободлать ресурсы исполнитель илипрораб тот кто поставил задачу должен предоставить ресурсы для её выполнения?
Ты сомневаешься, что вызываемая корутина корректно завершает время жизни своего внутреннего состояния? На счёт этого можешь быть спокоен:
http://coliru.stacked-crooked.com/a/9e5ecbe772104372
_>Это слишком простой пример. Тут никаких особых гарантий не надо, т.к. они не используют общих ресурсов и даже не выделяют их для выполнения зачачи.
_>Простой вопрос кто должен выделять и освободлать ресурсы исполнитель или
Ты сомневаешься, что вызываемая корутина корректно завершает время жизни своего внутреннего состояния? На счёт этого можешь быть спокоен:
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
Re[7]: Вопрос по корутинам
Здравствуйте, kov_serg, Вы писали:
_>Это слишком простой пример. Тут никаких особых гарантий не надо, т.к. они не используют общих ресурсов и даже не выделяют их для выполнения зачачи.
_>Простой вопрос кто должен выделять и освободлать ресурсы исполнитель илипрораб тот кто поставил задачу должен предоставить ресурсы для её выполнения?
Ты сомневаешься, что вызываемая корутина корректно завершает время жизни своего внутреннего состояния? На счёт этого можешь быть спокоен (см. пример ниже). А с точки зрения вызывающей функции процесс практически тот же самый, что и при многократном вызове обычной функции. Просто для передачи управления используеся новое словечко co_await.
http://coliru.stacked-crooked.com/a/9e5ecbe772104372
_>Это слишком простой пример. Тут никаких особых гарантий не надо, т.к. они не используют общих ресурсов и даже не выделяют их для выполнения зачачи.
_>Простой вопрос кто должен выделять и освободлать ресурсы исполнитель или
Ты сомневаешься, что вызываемая корутина корректно завершает время жизни своего внутреннего состояния? На счёт этого можешь быть спокоен (см. пример ниже). А с точки зрения вызывающей функции процесс практически тот же самый, что и при многократном вызове обычной функции. Просто для передачи управления используеся новое словечко 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