c++开源协程库libgo介绍及使用,srs协程,boost协程 Boost::fiber

news2025/1/8 10:36:41

https://www.cnblogs.com/qwsdcv/p/9115364.html

Boost - 从Coroutine2 到Fiber - 开学五年级了 - 博客园

协程就是由程序员控制跑在线程里的“微线程”。它可以由程序员调度,切换协程时代价小(切换根据实现不同,消耗的CPU周期从几十到几百不等),创建时耗费资源小。十分适用IO密集的场景。

Boost::Coroutine2

boost的Coroutine2不同于Goroutine,golang的协程调度是由Go语言完成,而boost::coroutine2的协程需要自己去调度。

Fiber

在实际生产中,我们更适合用fiber来解决问题。fiber有调度器,使用简单,不需要手动控制执行流程。

#include <boost\fiber\all.hpp>

#include <chrono>
#include <string>
#include <ctime>
#include <iostream>
#include <cstdlib>


using namespace std;
using namespace boost;

void callMe(fibers::buffered_channel<string>& pipe) {
	std::time_t result = std::time(nullptr);
	string timestr = std::asctime(std::localtime(&result));
	pipe.push(timestr);
}


int main() {
	fibers::buffered_channel<string> pipe(2);
	fibers::fiber f([&]() {callMe(pipe); });
	f.detach();
	string str;
	pipe.pop(str);
	cout << str << "\n";
	system("pause");

	return 0;
}

boost::fibers是一个拥有调度器的协程。看上去fiber已经和goroutine完全一样了。在fiber里不能调用任何阻塞线程的接口,因为一旦当前fiber被阻塞,那意味着当前线程的所有fiber都被阻塞了。因此所有跟协程相关的阻塞接口都需要自己实现一套协程的包装,比如this_fiber::sleep_for()。这也意味着数据库之类的操作没办法被fiber中直接使用。但好在fiber提供了一系列方法去解决这个问题。

使用非阻塞IO

int read_chunk( NonblockingAPI & api, std::string & data, std::size_t desired) {
    int error;
    while ( EWOULDBLOCK == ( error = api.read( data, desired) ) ) {
        boost::this_fiber::yield();
    }
    return error;
}

主要思想就是,当前fiber调用非阻塞api轮询,一旦发现该接口会阻塞,就调用boost::this_fiber::yield()让出执行权限给其他协程,直到下次获得执行权限,再次查看是否阻塞。

https://www.cnblogs.com/qwsdcv/p/9115364.html

掌握C/C++协程编程,轻松驾驭并发编程世界

https://zhuanlan.zhihu.com/p/648020168

boost coroutine 实现原理记录 - 简书

(699条消息) c++开源协程库libgo介绍及使用_特立独行的猫a的博客-CSDN博客

如何评价c++的协程库libgo? - 知乎 (zhihu.com)

腾讯Libco协程开源库 源码分析 全系列总结博客_腾讯libco库_Love 6的博客-CSDN博客

C/C++ 协程库boost.coroutine2、魅族libgo、腾讯libco、开源libaco详解-CSDN博客

Coroutines in LLVM — LLVM 19.0.0git documentation

github.com

SRS5.0第一大炮:如何实现SRT协程化 - 知乎 (zhihu.com)

Srs的协程架构-高性能服务器开发 (0voice.com)

SRS(Simple RTMP Server)是一个开源的流媒体服务器,采用了协程架构来提高并发性能和资源利用率。下面是SRS协程架构的一般概述:

  1. 协程模型:SRS使用了基于事件循环的协程模型。它使用协程库(如libco或Boost.Coroutine)来实现轻量级的用户态线程,避免了传统线程切换的开销。

  2. 单线程多路复用:SRS采用单线程多路复用机制,在一个线程中同时处理多个连接和请求。通过非阻塞IO和事件驱动模型,有效地提高了并发性能。

  3. 异步IO操作:SRS使用异步IO操作来处理网络读写操作,以提高IO性能和资源利用率。它将网络数据读取和写入操作转化为非阻塞的异步调用,并通过回调函数来处理完成后的通知。

  4. 事件驱动:SRS基于事件驱动模型进行开发。它通过监听各种事件(如连接建立、数据到达等),并相应地执行相应的处理逻辑。这种方式避免了线程间同步和互斥操作,提高了系统的响应速度和吞吐量。

总体而言,SRS的协程架构通过利用协程模型、单线程多路复用、异步IO和事件驱动等技术手段,实现了高效的并发处理能力和资源利用率。这使得SRS成为一个可靠而高性能的流媒体服务器。

Boost::fiber  协程

Boost.Fiber 是一个提供用户空间线程(fibers)的库,它允许在单一线程中实现并发。以下是一个简单的例子,展示如何使用 Boost.Fiber 创建和切换协程。

首先,确保你已经安装了 Boost.Fiber 库。

然后,你可以使用以下代码:

#include <iostream>
#include <boost/fiber.hpp>
 
int main() {
    // 初始化 boost fiber 库
    boost::fibers::use_scheduling_algorithm<boost::fibers::algo::round_robin>();
 
    // 创建一个 fiber
    boost::fibers::fiber fib([]() {
        std::cout << "Fiber is running." << std::endl;
        // 在这里可以执行更多的协程任务
    });
 
    // 启动 fiber
    fib.start();
 
    // 在主线程中执行其他任务
    std::cout << "Main thread is running." << std::endl;
 
    return 0;
}

这段代码创建了一个协程并启动它。然后主线程继续运行。这个例子展示了如何简单地使用 Boost.Fiber 创建和管理协程。在实际应用中,你可以根据需要添加更多的逻辑和协程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下载b站高清视频

需要使用的edge上的一个扩展插件&#xff0c;所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站&#xff0c;登录自己账号&#xff08;登录后才能下载到高清&#xff01;&#xff01;&#xff09;。打开一个视频&#xff0c;选择自…

flutter 专题二十四 Flutter性能优化在携程酒店的实践

Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年&#xff0c;这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合&#xff0c;大大提高了研发效率。在开发过程中&#xff0c;也遇到了一些性能相关问题和…

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…

vulnhub靶场【DC系列】之5

前言 靶机&#xff1a;DC-5&#xff0c;IP地址为192.168.10.4 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用VMWare&#xff0c;网卡为桥接模式 对于文章中涉及到的靶场以及工具&#xff0c;我放置网盘中https://pan.quark.cn/s/2fcf53ade985 主机发现 使用…

双模态视觉特征流用于医学报告生成|文献速递-视觉大模型医疗图像应用

Title 题目 Dual-modality visual feature flow for medical report generation 双模态视觉特征流用于医学报告生成 01 文献速递介绍 医学报告生成是一项新兴的跨模态文本生成任务&#xff08;X. Zeng et al., 2020&#xff1b;Najdenkoska et al., 2022&#xff1b;Li et…

基于Fluent和深度学习算法驱动的流体力学计算与应用

物理模型与深度学习的融合&#xff1a;研究如何将传统的物理模型与深度学习算法相结合&#xff0c;以提高流体力学问题的预测准确性和计算效率。复杂流动模拟&#xff1a;利用深度学习技术对复杂流动现象进行模拟和分析&#xff0c;包括湍流、多相流、非牛顿流体等&#xff0c;…

记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-动态表单(2)

接1的内容&#xff0c;那么有这么一个需求&#xff01; 需求分析 需要修改某一个配置的时候 1.从对应的api中读取消息&#xff0c;消息内容为Json格式的 2.基于当前的Json渲染成表单提供给管理端的客户呈现 3.管理端的用户可以基于这个表单的内容进行修改&#xff0c;然后提交…

pycharm-pyspark 环境安装

1、环境准备&#xff1a;java、scala、pyspark、python-anaconda、pycharm vi ~/.bash_profile export SCALA_HOME/Users/xunyongsun/Documents/scala-2.13.0 export PATH P A T H : PATH: PATH:SCALA_HOME/bin export SPARK_HOME/Users/xunyongsun/Documents/spark-3.5.4-bin…

Clisoft SOS设置Workarea

Clisoft SOS设置Workarea 本人也是刚刚接触这个软件&#xff0c;可能有些方面不够完善&#xff0c;欢迎大佬指点。 这里就不演示创建创建Server和Project&#xff0c;可以参考Clisoft SOS设置Server和Project 创建Workarea 创建好目录并设置好权限 # 创建组 [bhlumaster ~]$…

数据结构:LinkedList与链表—无头双向链表(二)

目录 一、什么是LinkedList&#xff1f; 二、LinkedList的模拟实现 1、display()方法 2、addFirst(int data)方法 3、addLast(int data)方法 4、addIndex(int index,int data)方法 5、contains(int key)方法 6、remove(int key)方法 7、removeAllKey(int key)方法 8、…

基于SpringBoot实现的保障性住房管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

【Linux】硬链接和软连接(符号连接)

目录 硬链接 软连接 硬链接和软连接的区别 硬链接 ln根据linux系统分配给文件inode(ls -li)进行建立&#xff0c;没办法跨越文件系统 格式&#xff1a;ln 被链接的文件(源文件) 生成的链接文件(目标文件) 1) 硬链接的属性 - 相当于生成一个副本 起别名 2) 修改内容都变化…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法&#xff08;CA-MOEA&#xff09; 一、算法简介 简介&#xff1a; 现有的多目标进化算法&#xff08;moea&#xff09;在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题&#xff08;MOPs&#xff…

基于SpringBoot的乐器商城购物推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【vba源码】自动获取汇率

Hi&#xff0c;大家好&#xff01; 没有想到今天居然是腊八&#xff0c;过了腊八就是年&#xff0c;离过年越来越近了&#xff0c;那在这里给大家就拜个年&#xff0c;希望大家在新的一年都有好事发生。 最近在弄点小项目&#xff0c;在项目遇到了一个汇率计算的问题&#xff…

JavaEE初阶——计算机工作原理

一、什么是JavaEE JavaEE&#xff08;Java Platform&#xff0c;Enterprise Edition&#xff09;是sun公司&#xff08;2009年4月20日甲骨文将其收购&#xff09;推出的企业级应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器…

【Unity3D】AB包加密(AssetBundle加密)

加密前&#xff1a; 加密后&#xff0c;直接无法加载ab&#xff0c;所以无法正常看到ab内容。 using UnityEngine; using UnityEditor; using System.IO; public static class AssetBundleDemoTest {[MenuItem("Tools/打包!")]public static void Build(){//注意:St…

数据库语句学习

WHERE AND: 请编写 SQL 语句&#xff0c;从 courses 表中&#xff0c;选取课程名为 Web 或者 Big Data 的课程信息&#xff0c;如果这两门课程存在&#xff0c;请将这两门课程的信息全部返回。 SELECT * FROM courses where name in (Web,Big Data) -- 等同于 -- WHERE name …

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好&#xff0c;我是你们的老朋友&#xff0c;一个热衷于探讨科技与教育结合的产品经理。今天&#xff0c;我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音&#xff0c;让我们一起来揭开它的神秘面纱吧&#xff0…

Postman接口测试05|实战项目笔记

目录 一、项目接口概况 二、单接口测试-登录接口&#xff1a;POST 1、正例 2、反例 ①姓名未注册 ②密码错误 ③姓名为空 ④多参 ⑤少参 ⑥无参 三、批量运行测试用例 四、生成测试报告 1、Postman界面生成 2、Newman命令行生成 五、token鉴权&#xff08;“…