协程libgo的使用

c++开源协程库libgo介绍及使用-CSDN博客

libgo库的github地址:GitHub - yyzybb537/libgo: Go-style concurrency in C++11

使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C++原生的性能优势。它的特点有:

1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能。

2.支持海量协程, 创建100万个协程只需使用2GB内存。

3.允许用户自由控制协程调度点,随时随地变更调度线程数。

4.支持多线程调度协程,极易编写并行代码,高效的并行调度算法,可以有效利用多个CPU核心。

5.可以让链接进程序的同步的第三方库变为异步调用,大大提升其性能。再也不用担心某些DB官方不提供异步driver了,比如hiredis、mysqlclient这种客户端驱动可以直接使用,并且可以得到不输于异步driver的性能。

6.动态链接和静态链接全都支持,便于使用C++11的用户静态链接生成可执行文件并部署至低版本的linux系统上。

7.提供协程锁(co_mutex), 定时器, channel等特性, 帮助用户更加容易地编写程序。

8.网络性能强劲,在Linux系统上超越ASIO异步模型,尤其在处理小包和多线程并行方面非常强大。

在源码的samples目录下有很多示例代码,内含详细的使用说明,让用户可以很轻易地学会使用libgo。

编译

mkdir build

cd build/

cmake ..

make debug

sudo make uninstall

sudo make install

复制代码
#include <libgo/coroutine.h>
#include <stdio.h>
#include <thread>
 
void foo()
{
    printf("function pointer\n");
}
 
struct A {
    void fA() { printf("std::bind\n"); }
    void fB() { printf("std::function\n"); }
};
 
int main()
{
    //----------------------------------
    // 使用关键字go创建协程, go后面可以使用:
    //     1.void(*)()函数指针, 比如:foo.
    //     2.也可以使用无参数的lambda, std::bind对象, function对象, 
    //     3.以及一切可以无参调用的仿函数对象
    //   注意不要忘记句尾的分号";".
    go foo;
 
    go []{
        printf("lambda\n");
    };
 
    go std::bind(&A::fA, A());
 
    std::function<void()> fn(std::bind(&A::fB, A()));
    go fn;
 
    // 也可以使用go_stack创建指定栈大小的协程
    //   创建拥有10MB大栈的协程
    go co_stack(10 * 1024 * 1024) []{
        printf("large stack\n");
    };
 
    // 协程创建以后不会立即执行,而是暂存至可执行列表中,等待调度器调度。
    // co_sched是默认的协程调度器,用户也可以使用自创建的协程调度器。 
    // 当仅使用一个线程进行协程调度时, 协程地执行会严格地遵循其创建顺序.
 
    // 仅使用主线程调度协程.
    // co_sched.Start();
 
    // 以下代码可以使用等同于cpu核心数的线程调度协程.(包括主线程)
    // co_sched.Start(0);
 
    // 以下代码允许调度器自由扩展线程数,上限为1024.
    // 当有线程被协程阻塞时, 调度器会启动一个新的线程, 以此保障
    // 可用线程数总是等于Start的第一个参数(0表示cpu核心数).
    // co_sched.Start(0, 1024);
 
    // 如果不想让调度器卡住主线程, 可以使用以下方式:
    std::thread t([]{ co_sched.Start(); });
    t.detach();
    co_sleep(100);
    //----------------------------------
 
    //----------------------------------
    // 除了上述的使用默认的调度器外, 还可以自行创建额外的调度器,
    // 协程只会在所属的调度器中被调度, 创建额外的调度器可以实现业务间的隔离.
 
    // 创建一个调度器
    co::Scheduler* sched = co::Scheduler::Create();
 
    // 启动4个线程执行新创建的调度器
    std::thread t2([sched]{ sched->Start(4); });
    t2.detach();
 
    // 在新创建的调度器上创建一个协程
    go co_scheduler(sched) []{
        printf("run in my scheduler.\n");
    };
 
    co_sleep(100);
    return 0;
}

g++ -std=c++11 test.cpp -llibgo -ldl -lpthread

相关推荐
琥珀色糖32 分钟前
Linux守护进程
linux·终端·守护进程·会话·进程组
开心大爆炸4 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
oushaojun25 小时前
大厂 C++ 面试:深度剖析 Linux Signal 信号机制(转)
linux
苏生Susheng6 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
Ruiery6 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
分支预测失败6 小时前
RISC-V AIA 中断架构实战:从 PLIC 到 APLIC 与 IMSIC 的迁移
linux·后端
GeW6 小时前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux
snow@li6 小时前
服务器运维:Alibaba Cloud Linux 4 LTS 64位 根目录全景深度解析文章
linux·运维·服务器
苏生Susheng7 小时前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
额额额对了7 小时前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议