Здравствуйте, 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