WebRTC源代码探索之旅——多线程篇(5 - 2)

本文深入探讨了WebRTC中talk_base::EventDispatcher类的实现,它模拟了跨平台的多线程事件处理,特别是在Windows上的WSAEvent功能。在Linux上,EventDispatcher通过管道来实现事件的模拟。尽管存在一些限制,如多个select等待同一EventDispatcher可能导致问题,但在实际使用中由于每个实例隶属于唯一一个PhysicalSocketServer,这一问题得以避免。文章还对比了Windows和Linux平台上的API调用,帮助理解其工作原理。
摘要由CSDN通过智能技术生成

5.3 talk_base::EventDispatcher

 

talk_base::EventDispatcher类实现了跨平台的等价于Win32自动重置(autoreset)WSAEvent的功能。在Windows平台上有网络多线程开发经验的读者应该很熟悉WSAEvent,我就不再多做介绍了。

 

我在1.1节讲解过talk_base::Event类。那talk_base::PhysicalSocketServer还需要talk_base::EventDispatcher来模拟Event呢?这是应为talk_base::Event仅仅实现了Win32的WaitForSingleObject函数的功能,这无法应用到多路信号分离器里面去。多路信号分离器需要有能力在一个阻塞函数里等待多个event和IO信号的能力,在Windows平台上就是WSAWaitForMultipleEvents函数的功能。

 

与之相类似的在Linux平台上可以使用的API有select函数,不过select函数只能等待IO信号不能等待其他Event。这就很难实现一个阻塞函数同时等待IO信号和消息队列的功能。这对于网络服务器端的开发并不是非常重要,但是对于图形用户界面客户端的开发没有这个功能有时会变得很麻烦。而talk_base::EventDispatcher的职责就是为我们模拟出这个功能。

 

既然select函数已经具有了我们需要的一半功能,怎样才能获得另一半功能呢?比较直接的方法就是将一个event的signal语义转化为IO信号,是的WebRTC就是这么做的。Linux版本的talk_base::EventDispatcher的一个成员变量是一对管道(pipe)的文件描述符。如果需要signal一个talk_base::EventDispatcher,只要对这个管道发送一个字节(内容无所谓),就能打开select函

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值