分类: LINUX
2011-04-16 22:51:25
1. 前言
Darwin Streaming Server是Apple公司提供的开源实时流媒体播放服务器程序。整个程序使用C++编写,在设计上遵循高性能,简单,模块化等程序设计原则,务求做到程序高效,可扩充性好。
本文简述了程序的整个结构,目的是为了以后阅读及修改程序的方便。
解开程序,程序的主要目录结构及作用如下
APIModules/ 模块程序的目录
APIStubLib/ 程序公共接口类目录
CommonUtilitiesLib/ 通用库
Server.tproj/ 主程序目录
QTFileLib/ mov, MP4文件读写库
RTSPClientLib/ RTSP客户端协议库
RTCPUtilitiesLib/ RTCP协议库
PlaylistBroadcaster.tproj/ MP4播放列表广播器
2. 重要基类结构
每个C++程序总有自己的基本类库结构,这种结构一般是程序的工具类,及基本接口类。
在Darwin Streaming Server中CommonUtilitiesLib目录下是放着程序的基本类库结构
主要重要的是:
Task类,TaskThread类,TaskThreadPool类:这三个类封装了线程库。三个类相互作用,通过Friend Class,使表现在外端的只有Task类,在这里,我们可以这样看:Task就是CPU使用片断,TaskThreadPool是CPU管理程序,TaskThread就是CPU。这样就使我们只需关心Task类就可,至于怎么调度,这是TaskThread及TaskThreadPool的事了。
下面我们来看这三个类是怎么互相作用从而形成一个整体的。
a. Virtual TaskThread::Entry():这个函数是整个线程函数的第一个执行函数,线程入口函数是TaskThread 从父类继承过来的Static OSThread::_Entry(),这个静态函数的唯一作用是执行Entry这个函数,这时的this指针是传进来的参数。这样就实现了线程的类封装。TaskThread::Entry()函数是一个循环,它不停的调用本身的WaitForTask函数,从自己内部的Queue中取得要运行的Task类指针。然后运行其中的Task:::Run()函数。
b. Virtual TaskThread::WaitForTask() 这个函数负责不停的从内部的队列中取到Task才返回。
c. static TaskThread **TaskThreadPool:: sTaskThreadArray. 这个变量是一个很重要的变量,通过它,我们就能在线程外与线程内通信,(要知道TaskThread的指针在线程类就是this指针,在线程外就是sTaskThreadArray的里面放的值。这样的话,我们就可以通过这个指针(或者说死了,也就是这个队列)来进行通讯。