目录
- 1 协程
- 2 实例
- 3 运行
1 协程
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。
协程类图如下:
2 实例
#include <coroutine>
#include <iostream>
#include <optional>template<std::movable T>
class Generator
{
public:struct promise_type{Generator<T> get_return_object(){return Generator{Handle::from_promise(*this)};}static std::suspend_always initial_suspend() noexcept{return {};}static std::suspend_always final_suspend() noexcept{return {};}std::suspend_always yield_value(T value) noexcept{current_value = std::move(value);return {};}// Disallow co_await in generator coroutines.// 不允许在生成器协同程序中使用co_await。void await_transform() = delete;[[noreturn]]static void unhandled_exception() { throw; }std::optional<T> current_value;};using Handle = std::coroutine_handle<promise_type>;explicit Generator(const Handle coroutine) :m_coroutine{coroutine}{}Generator() = default;~Generator(){if (m_coroutine)m_coroutine.destroy();}Generator(const Generator&) = delete;Generator& operator=(const Generator&) = delete;Generator(Generator&& other) noexcept :m_coroutine{other.m_coroutine}{other.m_coroutine = {};}Generator& operator=(Generator&& other) noexcept{if (this != &other){if (m_coroutine)m_coroutine.destroy();m_coroutine = other.m_coroutine;other.m_coroutine = {};}return *this;}// Range-based for loop support.class Iter{public:void operator++(){m_coroutine.resume();}const T& operator*() const{return *m_coroutine.promise().current_value;}bool operator==(std::default_sentinel_t) const{return !m_coroutine || m_coroutine.done();}explicit Iter(const Handle coroutine) :m_coroutine{coroutine}{}private:Handle m_coroutine;};Iter begin(){if (m_coroutine)m_coroutine.resume();return Iter{m_coroutine};}std::default_sentinel_t end() { return {}; }private:Handle m_coroutine;
};template<std::integral T>
Generator<T> range(T first, const T last)
{while (first < last)co_yield first++;
}int main()
{for (const char i : range(65, 91))std::cout << i << ' ';std::cout << '\n';
}
3 运行
运行结果:
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