SRS对StateThreads的多线程改造—SRS对StateThreads的改进与完善

在前面《StateThread为什么不支持多线程》一文中,讲解了为什么 StateThreads 不支持多线程,要利用 CPU 多核,只能用 fork 开多进程。

实际上就是全局变量的问题,不过 SRS 使用了 GCC 编译器的关键字 __thread 解决了全局变量的问题。如下:

__thread 修饰全局变量之后,就相当于每个 线程都有一个自己的全局变量,相互之间不影响,关于 __thread 的详细介绍,可以阅读《Thread-Local Storage

由于 __thread 关键字的实现跟链接器(ld)、动态链接器(ld.so)和系统库(libc.solibpthread.so)有很大的关联,所以不是什么平台都能使用 __thread 关键字的。

所以目前 SRS 改造后的多线程 StateThreads 只能在 Linux 跟 Darwin 平台运行,其他平台不知道是否会存在问题。


我们只需要下载 1.9.5 版本的 StateThreads,就能看到多线程的代码,其实改动并不大,全都在这个 commit 里面了。

不过 1.9.5 版本的 StateThreads 并没有提供 example 目录示例,所以我们需要把之前 1.9 版本的 example 里面的示例拷贝过来,然后做一些改动。

我只拷贝了 lookupdns 示例,并且使用了 pthread_create 创建了多线程,可以点击 这里 下载我修改好的仓库代码。

下载完之后执行下面的命令编译:

ini 复制代码
make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"

然后 st_init() 后面打一个断点,观察每个 线程 的 _st_this_vp(虚拟进程)变量的地址,会发现每个线程的虚拟进程变量的地址都是不一样的。他们线程各自有各自的全局变量。


SRS 对 StateThreads的 多线程改造有个地方没改过来,就是 idle 协程的退出逻辑,需要把 exit() 改成 pthread_exit(),只退出单个线程,而不是退出整个进程。


然后我又用 Valgrind 跑了一遍 lookupdns,是有发现内存泄漏的,可能跟 pthread_exit() 有关,如下:

css 复制代码
valgrind --tool=memcheck --leak-check=full ./obj/lookupdns srs.xianwaizhiyin.net

可能是 Valgrind 误报,也可能会真的有问题,具体后面再研究补充


本文是《 SRS原理 》一书中的文章,如需观看更多内容,请购买本书。

相关推荐
SHERlocked9321 小时前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
mortimer15 天前
Python + FFmpeg 视频自动化处理指南:从硬件加速到精确剪辑
python·ffmpeg·音视频开发
否子戈16 天前
做中国人自己的视频编辑UI框架,WebCut正式开源
前端框架·音视频开发·视频编码
音视频牛哥17 天前
从低延迟到高可用:RTMP与 HTTP/HTTPS-FLV在App播放体系中的角色重构
人工智能·音视频·音视频开发·http-flv播放器·https-flv播放器·ws-flv播放器·wss-flv播放器
音视频牛哥22 天前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能
快乐10123 天前
Media3 ExoPlayer无法播放不带.m3u8后缀hls媒资
音视频开发
_AaronWong24 天前
基于 Vue 3 的屏幕音频捕获实现:从原理到实践
前端·vue.js·音视频开发
快手技术1 个月前
超越 VTM-RA!快手双向智能视频编码器 BRHVC 亮相 NeurIPS2025
音视频开发
快乐1011 个月前
Media3 ExoPlayer扩展切换声道能力
音视频开发
yangguang1 个月前
音视频开发全景图:播放器是怎样炼成的
音视频开发