当前位置: 首页 > news >正文

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

相关文章:

协程libgo的使用

c开源协程库libgo介绍及使用-CSDN博客 libgo库的github地址&#xff1a;GitHub - yyzybb537/libgo: Go-style concurrency in C11 使用libgo编写并行程序&#xff0c;即可以像golang一样开发迅速且逻辑简洁&#xff0c;又有C原生的性能优势。它的特点有&#xff1a; 1.提供go…...

什么叫低频晶振?低频晶振最低频率能达到多少?低频晶振封装尺寸有哪些?

低频晶振指的是那些工作在较低频率范围内的晶体振荡器&#xff0c;通常这类振荡器的标称频率低于8MHz。这些晶振在各种电子设备中都有应用&#xff0c;尤其是在那些需要精确但不需要高频振荡的应用场景中&#xff0c;比如实时时钟(RTC)、低速串行通信接口(如UART、IC等)、以及一…...

Splunk Enterprise 任意文件读取漏洞(CVE-2024-36991)

文章目录 前言漏洞描述影响版本漏洞复现POC批量检测-nuclei脚本 修复建议 前言 Splunk Enterprise 是一款强大的机器数据管理和分析平台&#xff0c;能够实时收集、索引、搜索、分析和可视化来自各种数据源的日志和数据&#xff0c;帮助企业提升运营效率、增强安全性和优化业务…...

零基础STM32单片机编程入门(九)IIC总线详解及EEPROM实战含源码视频

文章目录 一.概要二.IIC总线基本概念1.总体特征2.通讯流程 三.EEPROM介绍1.M24C08基本介绍2.向M24C08写一个字节时序图3.从M24C08读一个字节时序图 四.GPIO模拟IIC驱动M24C08读写五.CubeMX工程源代码下载六.讲解视频链接地址七.小结 一.概要 IIC(Inter&#xff0d;Integrated …...

数据库的操作

【一】库的增删改查 【0】导入数据文件 source D:\bjpowernode.sql 【1】创建数据库 语法&#xff1a; create database [if not exists] 数据库名 [character set 编码字符集]; create databases db1; # 设置库的默认编码 create databases db1 charsetgbk; 【2】查看数据…...

常见的认证方式

认证机制是一种用户确定用户身份或者权限的安全措施&#xff0c;比如用来验证某个用户是否有权限访问一个资源&#xff0c;如果认证通过&#xff0c;用户就可以成功访问&#xff0c;反之则会访问失败 常见的认证方式有四种&#xff0c;分别是 Basic、Digest、OAuth 和 Bearer …...

DolphinScheduler部署安装or基础介绍(一)

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用 DolphinScheduler核心架构 DolphinScheduler的主要角色如下&#xff1a; Ma…...

Failed building wheel for pyaudio Running setup.py clean for pyaudio

从错误信息来看&#xff0c;问题出在 pyaudio 包的构建过程中。具体来说&#xff0c;缺少 portaudio.h 头文件&#xff0c;这通常是因为系统上没有安装 portaudio 库。 以下是解决此问题的步骤&#xff1a; 安装系统依赖&#xff1a; 在大多数基于 Debian 的系统&#xff08;如…...

【ARMv8/v9 GIC- 700 系列 1 -- Programmers model for GIC-700】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC-700 Programmers model寄存器实现和访问模式接口宽度和数据格式访问类型安全寄存器访问地址映射和页面GIC-700 Register map pagesSummaryGIC-700 Programmers model GIC-700是ARM的一种通用中断控制器,它遵循GICv3和GICv4架构…...

exel带单位求和,统计元素个数

如果exel表格中&#xff0c;如果数据有单位&#xff0c;无法直接用 自动求和 直接求和。如下图所示&#xff0c;求和结果为0&#xff0c;显然不是我们想要的。 用下面的公式求和&#xff0c;单位不是“个”的时候记得替换单位。统计范围不是“C1:C7”也记得换一下啊&#xff01…...

JavaScript里方括号[]的使用

我们知道可用方括号来表示数组或者JSON对象的属性值&#xff0c;其实在特定场合&#xff0c;方括号还有妙用的。 比如我有数据源是一组JSON&#xff0c;其中有一个属性是时间字符串&#xff0c;我想对时间的小时、星期、日、月分别进行处理。每条JSON都各自生成一条新的JSON&am…...

俯卧撑计数器(Python)

通过 MediaPipe 检测人体姿态&#xff0c;计算俯卧撑角度和计数&#xff0c;并在图像上进行可视化展示 需要有cv2库和mediapipe库 mediapipe库&#xff1a; MediaPipe是Google开源的机器学习框架&#xff0c;用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的…...

UVA12342 Tax Calculator 题解

题目传送门 题目大意 题目描述 某国所得税计算十分复杂。该国政府指定你制作一个自动计算所得税的程序。以下是该国计算所得税的规则&#xff1a; 所得税免征额为 180000 180000 180000 元。应纳税额中不超过 300000 300000 300000 元的所得额&#xff0c;按 10 % 10\% …...

WebKit中Websockets的全面支持:实现高效实时通信

WebKit中Websockets的全面支持&#xff1a;实现高效实时通信 Websockets是一种网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信&#xff0c;从而实现服务器与客户端之间的实时数据交换。WebKit作为许多流行浏览器的底层引擎&#xff0c;对Websockets提供了全面的…...

微信小程序的智慧物流平台-计算机毕业设计源码49796

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…...

旅游 | 西岳华山

得到了再失去&#xff0c; 总比从来没有得到更伤人。 ——胡赛尼《追风筝的人》 目录 旅游 | 西岳华山00 | 旅游导图01 | 旅游路线1.1 北上西下&#xff08;徒步&#xff09;1.2 北上西下&#xff08;索道&#xff09;1.3 西上北下&#xff08;索道&#xff09;1.4 西上西下&am…...

如何优化Java中的内存占用?

如何优化Java中的内存占用&#xff1f; 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 理解Java内存管理机制 Java的内存管理主要由JVM负责&#xff0c;开发人员在编写代码时需要注意如何有效地…...

2024这三家上海闵行装修公司,值得一看

在繁华的上海闵行区&#xff0c;随着居民对生活品质追求的提升&#xff0c;越来越多人开始重视居住环境的打造。然而&#xff0c;面对众多装修公司的选择&#xff0c;不少消费者往往感到迷茫和困惑。今天&#xff0c;我们就来揭晓闵行区口碑与实力兼备的三家装修公司。 1、首先…...

K8S学习教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索

背景 wiki.js 是非常优秀的开源 Wiki 系统&#xff0c;尽管在与 xwiki 功能相比 &#xff0c;还不算完善&#xff0c;但也在不断进步。 常用的功能还是比较实用的&#xff0c;如&#xff1a;Wiki 写 作、分享、权限管理功能还是非常实用的&#xff0c;UI 设计非常的漂亮&#x…...

服务器该如何抵御CC攻击

CC攻击也是分布式拒绝服务攻击的一种类型&#xff0c;同时CC攻击也属于网络流量攻击&#xff0c;但是CC攻击主要是用来攻击网站页面的&#xff0c;向着目标网络服务器发送一些请求&#xff0c;以此来消耗目标网络服务器的资源&#xff0c;导致目标服务器无法响应正常请求&#…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...