随着CPU频率接近物理极限,多芯片、多核几乎成为了加速软件运行速度的唯一选择。与之相应地,多线程、异步编程以及并发编程成为了软件开发人员的必修课。因此,各种各样的开发框架不断涌现。在C++领域,boost的thread库等优秀的多线程框架也是其中的代表。特别是针对socket网络编程的boost.asio库可以轻松帮助开发人员实现多线程大量并发的网络服软件。
与这些框架相比,WebRTC的多线程模型还是比较特别的。它的核心是类似于WSAWaitForMultipleEvents的多路信号分离器。这是我最喜欢的多线程模型。它使每条线程既可以处理消息(post、send),同时也可以处理多个IO。并且在必要的情况下让一条线程独占(管理)一些资源,避免过多的使用锁造成线程死锁。个人认为这种模型可以帮助开发人员更容易地实现快速响应的界面程序。
WebRTC的线程模块放在/trunk/talk/base目录下,namespace使用talk_base::。主要涉及criticalsection、event、messagequeue、thread、messagehandler、physicalsocketserver等文件。顺便提一下,现在网上仅有的几篇关于WebRTC或是libjingle的文章多数从Sigslot开始讲解,但是我不打算现在对Sigslot进行展开,因为它还是很好理解的。不明白的朋友可以上网查询一下,或者姑且就把它当做函数回调(更精确地说它实现了C#的delegate)就可以了。在talk_base的多路信号分离器中只有少数几个地方使用了Sigslot,即使忽略它也不影响对多路信号分离器的理解。
1 event
event.h/event.cc文件中只有talk_base::Event类。