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

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>();
 
    // 创建一个 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.kler.cn/a/472355.html

相关文章:

  • 腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏
  • Jenkins内修改allure报告名称
  • C# 实现 gRPC 进程间通讯:两台设备的数据交换之道
  • 医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件
  • 使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享
  • 【机器学习:四、多输入变量的回归问题】
  • Redis奇幻之旅(四)4. Redis Cluster
  • 使用systemd管理MySQL服务器
  • AI 平台 GPU 节点上运行基于 PyTorch 的深度学习任务
  • Mac中配置vscode(第一期:python开发)
  • 【Linux】UOS统信服务器本地yum源搭建实践
  • 1/7 C++
  • [SeaTunnel] [MySql CDC] Generate Splits for table db.table error
  • 【LangGraph Agent架构篇—多智能体系统1】【多智能体网络】
  • go 1.23.4安装
  • 常用的数据引擎及其特点
  • 高阶知识库搭建实战五、(向量数据库Milvus安装)
  • 虚幻(UE)资源网站
  • gaussdb怎么查询一个表所在的表空间的总大小和可用大小,用GB为单位表示?
  • 【每日学点鸿蒙知识】关于热修复、图片预览、多个@State刷新性能问题等
  • 【网络安全技术与应用】(选修)实验2 用Wireshark分析典型TCP/IP体系中的协议
  • Web前端ui框架
  • LLM 训练中存储哪些矩阵:权重矩阵,梯度矩阵,优化器状态
  • javaCV音频剪切
  • 我的AI工具箱Tauri版-ZoomImageFlux图像缩放
  • 【网络安全 | 漏洞挖掘】HubSpot 全账户接管(万字详析)