协程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

相关推荐
deeper_wind8 小时前
k8s-容器化部署论坛和商城服务(小白的“升级打怪”成长之路)
linux·运维·容器·kubernetes
勇往直前plus8 小时前
VMware centos磁盘容量扩容教程
linux·运维·centos
政安晨9 小时前
Ubuntu 服务器无法 ping 通网站域名的问题解决备忘 ——通常与网络配置有关(DNS解析)
linux·运维·服务器·ubuntu·ping·esp32编译服务器·dns域名解析
路溪非溪11 小时前
嵌入式Linux驱动开发杂项总结
linux·运维·驱动开发
Neolock11 小时前
Linux应急响应一般思路(三)
linux·web安全·应急响应
被遗忘的旋律.12 小时前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记
轻松Ai享生活12 小时前
minidump vs core dump
linux
轻松Ai享生活13 小时前
详细的 Linux 常用文件系统介绍
linux
张童瑶13 小时前
Linux 离线安装lrzsz(rz、sz上传下载小插件)
linux·运维·centos
十五年专注C++开发14 小时前
通信中间件 Fast DDS(二) :详细介绍
linux·c++·windows·中间件·fastdds