它允许程序以更加顺序、简洁和可读的方式处理异步任务,避免了回调地狱和复杂的多线程同步问题。协程允许你在函数中暂停执行,并在稍后恢复执行,同时保持函数的上下文状态。

例子:

#include <iostream>
#include <coroutine>
#include <chrono>
#include <thread>

struct MyCoroutine {
    struct promise_type {
        MyCoroutine get_return_object() {
            return MyCoroutine(std::coroutine_handle<promise_type>::from_promise(*this));
        }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() { return {}; }
        void return_void() {}
        void unhandled_exception() {}
    };

    MyCoroutine(std::coroutine_handle<promise_type> handle) : handle(handle) {}
    
    ~MyCoroutine() {
        if (handle) {
            handle.destroy();
        }
    }

    std::coroutine_handle<promise_type> handle;
};

MyCoroutine myCoroutine() {
    std::cout << "Coroutine started." << std::endl;
    co_await std::chrono::seconds(2);
    std::cout << "Coroutine resumed after waiting." << std::endl;
}

int main() {
    auto coroutine = myCoroutine();
    std::cout << "Main thread." << std::endl;
    coroutine.handle.resume();
    std::cout << "Back to main thread." << std::endl;
    return 0;
}

C++标准库在C++20中引入了基本的协程支持,如std::coroutine_handle、co_await、co_yield等,但没有提供类似于其他语言中完整的高级协程库,原因主要是因为协程的应用场景复杂多样,不同的协程库有不同的设计理念和特性。
协程的应用场景非常广泛,涵盖了生成器、异步任务、状态机等不同的用途。不同的应用场景可能需要不同的库设计,单一的高级协程库难以满足所有需求,可能导致库设计和接口复杂化。