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协程架构的一般概述:
-
协程模型:SRS使用了基于事件循环的协程模型。它使用协程库(如libco或Boost.Coroutine)来实现轻量级的用户态线程,避免了传统线程切换的开销。
-
单线程多路复用:SRS采用单线程多路复用机制,在一个线程中同时处理多个连接和请求。通过非阻塞IO和事件驱动模型,有效地提高了并发性能。
-
异步IO操作:SRS使用异步IO操作来处理网络读写操作,以提高IO性能和资源利用率。它将网络数据读取和写入操作转化为非阻塞的异步调用,并通过回调函数来处理完成后的通知。
-
事件驱动: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 创建和管理协程。在实际应用中,你可以根据需要添加更多的逻辑和协程。