0%

什么是无栈协程

什么是无栈协程

  • 无栈协程是一种轻量级的协程实现方式,相比有栈协程,它们不拥有独立的调用栈。这种设计让无栈协程更加轻量,因为它们不需要为每个协程分配独立的栈空间,从而减少了内存的使用量。
  • 全程都在使用系统自动分配的栈空间,只不过是将一次调用和下一次调用之间所需要的数据利用某种数据结构(比如类的局部变量)手动保存了下来
  • 无栈协程的核心原理是将协程中的代码转换成一个或多个状态机。每当执行到协程内的一个异步调用时,协程会保存当前的状态(例如局部变量的值、程序执行到哪一行等),然后暂停执行,将控制权交回给协程的调度器或事件循环。当异步调用完成后,协程根据保存的状态恢复执行
  • 实际上就是利用系统的数据结构(比如类的成员)保存状态,外界需要其重新执行的时候读取该状态再执行
  • 例子
    #include <iostream>

    // 协程状态
    enum class CoroutineState {
    BeforeStart = 0,
    AfterHello,
    AfterWorld,
    Completed
    };

    class HelloWorldCoroutine {
    public:
    // 协程当前状态
    CoroutineState state = CoroutineState::BeforeStart;

    // 协程的执行函数
    void resume() {
    switch (state) {
    case CoroutineState::BeforeStart:
    // 第一个操作:打印"Hello"
    std::cout << "Hello, ";
    // 更新状态到下一步
    state = CoroutineState::AfterHello;
    // 退出当前执行,模拟异步操作的暂停
    return;
    case CoroutineState::AfterHello:
    // 第二个操作:打印"World"
    std::cout << "World!" << std::endl;
    // 更新状态到完成
    state = CoroutineState::AfterWorld;
    // 退出当前执行
    return;
    case CoroutineState::AfterWorld:
    // 协程已完成,不做任何操作
    return;
    default:
    // 非法状态
    std::cerr << "Invalid state" << std::endl;
    return;
    }
    }

    // 检查协程是否完成
    bool isCompleted() const {
    return state == CoroutineState::AfterWorld;
    }
    };

    int main() {
    HelloWorldCoroutine coroutine;

    // 循环执行,直到协程状态表示完成
    while (!coroutine.isCompleted()) {
    coroutine.resume();
    }

    return 0;
    }
  • 实际上就是将需要的状态手动保存了下来,在被外界调用的时候手动的恢复,是一种比较间接的协程实现方法