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函