随笔 - 165,  文章 - 0,  评论 - 4,  阅读 - 17960

协程(Coroutine)是一种用户态的轻量级线程,它可以在单线程内实现多个执行线程的切换和调度,而无需依赖操作系统的线程管理机制(简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换)。协程通常被称为“轻量级线程”或“用户级线程”。

协程的主要特点和优点包括:

  1. 轻量级: 协程的创建和切换成本很低,因为它们不需要像操作系统线程那样依赖内核态的线程切换。相比之下,创建和切换操作系统线程需要更多的系统资源。

  2. 协作式调度: 协程的调度是由程序员显式控制的,而不是由操作系统调度器来决定。这种协作式调度可以避免操作系统线程的上下文切换开销,并且可以更好地适应特定应用程序的需求。

  3. 简化并发编程: 协程可以简化并发编程,因为它们可以在同一线程内执行多个任务,并且可以通过显式的切换来控制任务的执行顺序和并发度。这使得编写高效的并发程序变得更加容易。

  4. 高并发性能: 由于协程是在单线程内执行的,因此可以避免多线程并发时的锁竞争和资源争夺问题,从而提高了并发程序的性能。

  5. 简化异步编程: 协程可以用于编写异步程序,例如异步IO操作或事件驱动的编程模型。协程可以在IO阻塞时切换到其他任务,从而提高了程序的并发性能。

总的来说,协程是一种轻量级的并发编程模型,具有低成本、高性能和简化编程等优点,适用于需要高并发性能和简洁代码的场景。
以下是一个使用C++中的协程库<coroutine>的简单例子:

#include <iostream>
#include <coroutine>

// 定义一个协程类型
struct MyCoroutine {
    // 协程状态枚举
    enum class State { Ready, Running, Done };

    // 定义协程状态
    State state = State::Ready;

    // 协程函数
    void operator()() {
        std::cout << "Coroutine started." << std::endl;
        state = State::Running;
        // 模拟一些计算
        for (int i = 0; i < 3; ++i) {
            std::cout << "Coroutine running " << i + 1 << std::endl;
            // 挂起协程
            co_yield;
        }
        std::cout << "Coroutine finished." << std::endl;
        state = State::Done;
    }
};

int main() {
    // 创建协程对象
    MyCoroutine coroutine;

    // 调用协程函数
    auto coroutine_handle = std::coroutine_handle<MyCoroutine>::from_fn(coroutine);
    coroutine_handle();

    // 模拟在其他任务中调度协程
    for (int i = 0; i < 3; ++i) {
        std::cout << "Main thread running " << i + 1 << std::endl;
        // 挂起主线程
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}

这个例子中,我们定义了一个简单的协程类型MyCoroutine,并在其中实现了一个简单的协程函数。在main函数中,我们创建了一个协程对象,并通过std::coroutine_handle来调用协程函数。在主线程中,我们模拟了其他任务的执行,然后再回到协程中执行。

这段代码将输出以下内容:

Coroutine started.
Coroutine running 1
Main thread running 1
Coroutine running 2
Main thread running 2
Coroutine running 3
Main thread running 3
Coroutine finished.

这里的输出顺序是先输出协程开始执行的消息,然后依次输出协程内部的计数消息和主线程中的计数消息,最后输出协程执行完成的消息。这个例子展示了协程和主线程之间的交替执行。

posted on   孜孜不倦fly  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示