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

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>();// 创建一个 fiberboost::fibers::fiber fib([]() {std::cout << "Fiber is running." << std::endl;// 在这里可以执行更多的协程任务});// 启动 fiberfib.start();// 在主线程中执行其他任务std::cout << "Main thread is running." << std::endl;return 0;
}

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

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

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

相关文章

用c实现C++类(八股)

在 C 语言中&#xff0c;虽然没有内建的面向对象编程&#xff08;OOP&#xff09;特性&#xff08;如封装、继承、多态&#xff09;&#xff0c;但通过一些编程技巧&#xff0c;我们仍然可以模拟实现这些概念。下面将用通俗易懂的方式&#xff0c;逐步介绍如何在 C 中实现封装、…

RabbitMQ 交换机、队列和路由键的命名规范

在 RabbitMQ 中&#xff0c;使用 Topic Exchange 模式时&#xff0c;交换机、队列和路由键的命名规范是非常重要的&#xff0c;尤其是在多环境和多微服务的场景中。合理的命名规范可以提高消息系统的可维护性、可扩展性以及可读性。以下是一些关于 Topic Exchange 模式中交换机…

记录一个移动端表格布局,就是一行标题,下面一列是对应的数据,一条一条的数据,还有点击数据进入详情的图标,还可以给一列加input输入框,还可以一对多

注&#xff1a;以下字段名都是随手写&#xff0c;并不规范&#xff0c;自己替换自己的&#xff0c;&#xff0c;只参考样式 注&#xff1a;以下重要的是布局&#xff0c;样式&#xff0c;宽高什么的再自己去搞吧 <view class"search"> <u-…

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…

ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用

目录 ELK工作原理展示图 一、ElasticSearch介绍&#xff08;数据搜索和分析&#xff09; 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…

【老白学 Java】项目演练 - Quizzes #2

项目演练 - Quizzes #2 文章来源&#xff1a;《Head First Java》修炼感悟。 上一篇文章老白仔细分析了 Quizzes 的类结构&#xff0c;本文接上一章继续对功能模块逐步完善。 整个程序没有复杂的算法&#xff0c;仅仅用到了一些基础知识&#xff0c;如果大家已经了解了这部分内…

k8s的原理和,k8s的安装

k8s:管理容器集群k8s的组成和调用原理cluster集群:控制平面和node共同构成一个cluster服务调用流程ingress控制器&#xff1a;让外部用户访问集群内部的服务kubeprox转发pod的容器中Control plan控制平面组件&#xff1a;控制和管理多个node1.api server:支持使用提供的api创建…

Python常用函数总结——超全面超详细_python函数大全及详解

Python作为一种高级编程语言&#xff0c;拥有丰富的内置函数库&#xff0c;这些函数大大简化了编程任务。以下是Python常用函数的总结及详解&#xff08;部分函数有所重复或归类&#xff0c;以展示其多样性和应用场景&#xff09;&#xff1a; 一、基础与数据类型相关 print(…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层&#xff0c;即传输层&#xff0c;为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议&#xff0c;但两者在设计上有明显的不同&…

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年&#xff0c;是 JuiceFS 开源版本推出的第 4 年&#xff0c;企业版的第 8 个年头。回顾过去这一年&#xff0c;JuiceFS 社区版依旧保持着快速成长的势头&#xff0c;GitHub 星标突破 11.1K&#xff0c;各项使用指标增长均超过 100%&#xff0c;其中文件系统总…

4、SDH为基础的多业务传送-MSTP

1、SDH&#xff08;Synchronous Digital Hierarchy&#xff0c;同步数字体系&#xff09; SDH 就像是一条超级高速公路&#xff0c;它的规则很严格&#xff0c;所有的车辆&#xff08;数据信号&#xff09;都要按照它规定的速度和车道&#xff08;标准的传输体制&#xff09;行…

初级前端面试题 - js

前言&#xff1a;众所周知&#xff0c;HTML,CSS,JS是学习前端所必备的。js的基础学好了&#xff0c;框架类的vue,react等都会接受的很快&#xff0c;因此js是前端很总要的一个部分&#xff0c;这篇文章将会结合面试题&#xff0c;对js的知识点进行总结 号外号外&#xff0c;这是…

linux的shell中自定义的分隔符怎么用

在 Shell 脚本中&#xff0c;自定义分隔符可以通过多种方式使用&#xff0c;特别是在处理文件或字符串时。常见的场景包括读取以特定字符分隔的文件、设置 IFS&#xff08;内部字段分隔符&#xff09;来分割字符串等。以下是几种常见方法及其示例&#xff1a; ### 1. 使用 IFS…

C#里使用libxl里演示输出日期和读取日期数据的例子

日期在EXCEL里也是一种复杂的数据处理, 为什么这样说呢? 因为日期显示,在世界各国里互不相同。 在许多西方国家,日期的表示顺序遵循“日-月-年”的规则,即“Day-Month-Year”,例如:12th January 2023。这种顺序在英语国家中普遍存在,如美国、英国、澳大利亚和加拿大…

使用 Maxwell 计算母线的电动势

三相短路事件的动力学 三相短路事件在电气系统中至关重要&#xff0c;因为三相之间的意外连接会导致电流大幅激增。如果管理不当&#xff0c;这些事件可能会造成损坏&#xff0c;因为它们会对电气元件&#xff08;尤其是母线&#xff09;产生极大的力和热效应。 短路时&#x…

cuda实现flash_attn_mma_share_kv源码分析

一 源码分析 1.1 函数入口 void flash_attn_mma_stages_split_q_shared_kv(torch::Tensor Q, torch::Tensor K, torch::Tensor V, torch::Tensor O, int stages) {CHECK_TORCH_TENSOR_DTYPE(Q, torch::kHalf) // Q [B,H,N,D]CHECK_TORCH_TENSOR_DTYPE(K, torch::kHalf) // K …

npm发布流程说明

一、进入要发布的项目根目录&#xff0c;初始化为npm包 npm initname&#xff1a;最重要的字段之一&#xff0c;项目名称&#xff08;少于214个字节&#xff09;。没有name和version不能进行安装&#xff1b; version&#xff1a;最重要的字段之一&#xff0c;项目版本。没有n…

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…

利用 Python 脚本批量创建空白 Markdown 笔记

文章目录 利用 Python 脚本批量创建空白 Markdown 笔记1 背景介绍2 需求描述3 明确思路4 具体实现4.1. 遍历 toc.md 文件&#xff0c;收集文件名和对应的文件内容4.2. 实现文件批量生成逻辑4.3. 补全缺失的工具函数4.4. 进一步补全工具函数中的工具函数 5 脚本运行6 注意事项 利…

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架&#xff0c;它提供了一种方式将 XML Schema (XSD) 映射到 Java 类&#xff0c;从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…