OSThread

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()等函数改变线程其他状态变量。


版权声明:本文为sunxiaopengsun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。