OSThread是DSS中最重要的类之一,它封装并且定义了使用线程的方式,因此需要重点讨论。OSThread类的定义如下:
class OSThread
{
1 public:
// 必须在使用其他OSThread函数前调用该初始化函数
2 static void Initialize();
3 OSThread(); //构造函数
4 virtual ~OSThread(); //析构函数
//子类继承该纯虚函数完成自己的工作
5 virtual void Entry() = 0;
6 void Start(); //启动线程
7 void Join(); //等待线程运行完成后删除
8 void Detach(); //使线程处于fDetached状态
9 static void ThreadYield(); //Windows平台不用
10 static void Sleep(UInt32 inMsec); //让线程睡眠
…
11 private:
//标识线程的状态
12 Bool16 fStopRequested:1;
13 Bool16 fRunning:1;
14 Bool16 fCancelThrown:1;
15 Bool16 fDetached:1;
16 Bool16 fJoined:1;
…
17 static void CallEntry(OSThread* thread);//调用子类重载的虚函数
18 #ifdef __Win32__
//使用_beginghreadex创建线程时的标准入口函数
19 static unsigned int WINAPI _Entry(LPVOID inThread);
20 #else
21 static void* _Entry(void* inThread); //unix下的入口函数
22 #endif
}
OSThread 封装了线程的基本功能,一个OSThread的实例代表一个线程。用户通过继承OSThread,并且重载其中的纯虚函数Entry(第5行),从而将自 己的任务交给该线程运行。OSThread内部运行机制比较复杂,为此我们用图3所示的流程来描述其运行过程。
另外,OSThread对于线程的状态定义了一套完整的控制方法。当用户调用start()函数后,按照上图,最终将调用CallEntry()函数,而 该函数在调用Entry()之前将线程设定为运行状态(thread->fRunning = true),当Entry()函数运行完后再设为非运行状态;在运行过程中,用户可以通过StopAndWaitForThread()、join()、 Detach()以及ThrowStopRequest()等函数改变线程其他状态变量。