协程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地址:GitHub - yyzybb537/libgo: Go-style concurrency in C11 使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C原生的性能优势。它的特点有: 1.提供go…...
什么叫低频晶振?低频晶振最低频率能达到多少?低频晶振封装尺寸有哪些?
低频晶振指的是那些工作在较低频率范围内的晶体振荡器,通常这类振荡器的标称频率低于8MHz。这些晶振在各种电子设备中都有应用,尤其是在那些需要精确但不需要高频振荡的应用场景中,比如实时时钟(RTC)、低速串行通信接口(如UART、IC等)、以及一…...
Splunk Enterprise 任意文件读取漏洞(CVE-2024-36991)
文章目录 前言漏洞描述影响版本漏洞复现POC批量检测-nuclei脚本 修复建议 前言 Splunk Enterprise 是一款强大的机器数据管理和分析平台,能够实时收集、索引、搜索、分析和可视化来自各种数据源的日志和数据,帮助企业提升运营效率、增强安全性和优化业务…...
零基础STM32单片机编程入门(九)IIC总线详解及EEPROM实战含源码视频
文章目录 一.概要二.IIC总线基本概念1.总体特征2.通讯流程 三.EEPROM介绍1.M24C08基本介绍2.向M24C08写一个字节时序图3.从M24C08读一个字节时序图 四.GPIO模拟IIC驱动M24C08读写五.CubeMX工程源代码下载六.讲解视频链接地址七.小结 一.概要 IIC(Inter-Integrated …...
数据库的操作
【一】库的增删改查 【0】导入数据文件 source D:\bjpowernode.sql 【1】创建数据库 语法: create database [if not exists] 数据库名 [character set 编码字符集]; create databases db1; # 设置库的默认编码 create databases db1 charsetgbk; 【2】查看数据…...
常见的认证方式
认证机制是一种用户确定用户身份或者权限的安全措施,比如用来验证某个用户是否有权限访问一个资源,如果认证通过,用户就可以成功访问,反之则会访问失败 常见的认证方式有四种,分别是 Basic、Digest、OAuth 和 Bearer …...
DolphinScheduler部署安装or基础介绍(一)
DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用 DolphinScheduler核心架构 DolphinScheduler的主要角色如下: Ma…...
Failed building wheel for pyaudio Running setup.py clean for pyaudio
从错误信息来看,问题出在 pyaudio 包的构建过程中。具体来说,缺少 portaudio.h 头文件,这通常是因为系统上没有安装 portaudio 库。 以下是解决此问题的步骤: 安装系统依赖: 在大多数基于 Debian 的系统(如…...
【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表格中,如果数据有单位,无法直接用 自动求和 直接求和。如下图所示,求和结果为0,显然不是我们想要的。 用下面的公式求和,单位不是“个”的时候记得替换单位。统计范围不是“C1:C7”也记得换一下啊!…...
JavaScript里方括号[]的使用
我们知道可用方括号来表示数组或者JSON对象的属性值,其实在特定场合,方括号还有妙用的。 比如我有数据源是一组JSON,其中有一个属性是时间字符串,我想对时间的小时、星期、日、月分别进行处理。每条JSON都各自生成一条新的JSON&am…...
俯卧撑计数器(Python)
通过 MediaPipe 检测人体姿态,计算俯卧撑角度和计数,并在图像上进行可视化展示 需要有cv2库和mediapipe库 mediapipe库: MediaPipe是Google开源的机器学习框架,用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的…...
UVA12342 Tax Calculator 题解
题目传送门 题目大意 题目描述 某国所得税计算十分复杂。该国政府指定你制作一个自动计算所得税的程序。以下是该国计算所得税的规则: 所得税免征额为 180000 180000 180000 元。应纳税额中不超过 300000 300000 300000 元的所得额,按 10 % 10\% …...
WebKit中Websockets的全面支持:实现高效实时通信
WebKit中Websockets的全面支持:实现高效实时通信 Websockets是一种网络通信协议,它允许在单个TCP连接上进行全双工通信,从而实现服务器与客户端之间的实时数据交换。WebKit作为许多流行浏览器的底层引擎,对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 系统功能分…...
旅游 | 西岳华山
得到了再失去, 总比从来没有得到更伤人。 ——胡赛尼《追风筝的人》 目录 旅游 | 西岳华山00 | 旅游导图01 | 旅游路线1.1 北上西下(徒步)1.2 北上西下(索道)1.3 西上北下(索道)1.4 西上西下&am…...
如何优化Java中的内存占用?
如何优化Java中的内存占用? 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 理解Java内存管理机制 Java的内存管理主要由JVM负责,开发人员在编写代码时需要注意如何有效地…...
2024这三家上海闵行装修公司,值得一看
在繁华的上海闵行区,随着居民对生活品质追求的提升,越来越多人开始重视居住环境的打造。然而,面对众多装修公司的选择,不少消费者往往感到迷茫和困惑。今天,我们就来揭晓闵行区口碑与实力兼备的三家装修公司。 1、首先…...
K8S学习教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索
背景 wiki.js 是非常优秀的开源 Wiki 系统,尽管在与 xwiki 功能相比 ,还不算完善,但也在不断进步。 常用的功能还是比较实用的,如:Wiki 写 作、分享、权限管理功能还是非常实用的,UI 设计非常的漂亮&#x…...
服务器该如何抵御CC攻击
CC攻击也是分布式拒绝服务攻击的一种类型,同时CC攻击也属于网络流量攻击,但是CC攻击主要是用来攻击网站页面的,向着目标网络服务器发送一些请求,以此来消耗目标网络服务器的资源,导致目标服务器无法响应正常请求&#…...
Claude Code 源码泄露深度剖析,Anthropic AI 编程助手的架构全解密
2026年3月31日,整个AI开发圈被一条消息炸开了锅。安全研究员Chaofan Shou(推特账号Fried_rice)在Anthropic官方发布的npm包中,意外发现了一个暴露的.map文件,正是这个看似不起眼的文件,直接泄露了Claude Co…...
C++ 网络服务端主线:从线程池到 Reactor 的完整路线图
一、为什么要写这个系列? 前面我已经把 C 并发基础和线程池完整走了一遍: std::threadstd::mutexstd::condition_variablestd::atomic手写线程池future / 拒绝策略 / 优雅关闭 但到这里,其实还只停留在: 并发组件层 也就是说&a…...
毕业查重不踩坑!Paperxie 免费查重,给毕业生的安心 buff
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/checkhttps://www.paperxie.cn/check 又是一年毕业季,当毕业论文的最后一个句号落下,查重就成了横亘在无数本科生面前的 “毕业拦路虎”。多少人熬了几…...
告别照相馆!AI头像生成器教你免费制作高质量职业头像
告别照相馆!AI头像生成器教你免费制作高质量职业头像 1. 为什么选择AI生成职业头像? 在当今数字化求职环境中,一张专业的头像照片已经成为简历不可或缺的部分。传统照相馆拍摄存在三个主要痛点: 成本高昂:专业摄影工…...
MAVLink垂直扩展:Emaxx导航板专用协议库设计与实践
1. 项目概述 mavlink_emaxx 是一个面向 Emaxx 导航板(Emaxx Nav Board)定制的 MAVLink 协议消息扩展库。该库并非独立协议栈,而是基于标准 MAVLink v2 协议规范构建的一组专用消息定义(message definitions)与配套 C…...
4步精通开源SMU调试工具:AMD Ryzen处理器深度配置与性能调优全攻略
4步精通开源SMU调试工具:AMD Ryzen处理器深度配置与性能调优全攻略 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...
快速原型设计:使用快马平台ai一键生成c语言银行系统项目骨架
今天想和大家分享一个快速验证技术方案的小技巧——用InsCode(快马)平台的AI生成功能快速搭建C语言项目原型。最近在准备一个银行系统的课程设计时,发现这个方式特别适合用来做前期技术验证。 为什么需要快速原型 刚开始做课程设计时,最头疼的就是花大量…...
LoRA训练助手GPU显存优化:Qwen3-32B INT4量化后仅需9.2GB显存稳定运行
LoRA训练助手GPU显存优化:Qwen3-32B INT4量化后仅需9.2GB显存稳定运行 1. 引言:当大模型遇见显存焦虑 如果你尝试过在个人电脑上运行大语言模型,大概率会遇到一个令人头疼的问题:显存不足。特别是像Qwen3-32B这样拥有320亿参数的…...
Pixel Language Portal保姆级教程:Hunyuan-MT-7B模型蒸馏轻量化(TinyMT)与移动端适配路径
Pixel Language Portal保姆级教程:Hunyuan-MT-7B模型蒸馏轻量化(TinyMT)与移动端适配路径 1. 项目背景与核心价值 Pixel Language Portal(像素语言跨维传送门)是一款基于腾讯Hunyuan-MT-7B大模型构建的创新翻译工具。…...
从Prompt到成稿|像素剧本圣殿输入剧情大纲→输出标准剧本全流程
从Prompt到成稿|像素剧本圣殿输入剧情大纲→输出标准剧本全流程 1. 工具介绍:像素剧本圣殿 像素剧本圣殿是一款基于Qwen2.5-14B-Instruct大模型深度优化的专业剧本创作工具。它将先进的AI文本生成能力与独特的8-Bit复古视觉风格相结合,为编…...
