【线程对象与线程】
线程从概念上讲就是一个执行的线索,原则上讲任何一段程序代码段都可以成为
一个线程,但是不同都操作系统的线程模型是不一样的,有的系统将线程作为用
户级来处理,真正的调度和资源分配单位是进程,而有的系统则将线程作为基本
的调度和资源分配单位。具体在windows这个OS上面,它的线程模型是由一个函数
入口指针和一个入口参数确定的,可以笼统的讲:在windows(95以上)系统中线
程就是一个运行着的函数。这个函数的原型生命如下:
DWORD WINAPI threadFunction(LPVOID);
创建线程的方法可以有两种:一种是使用API函数CreateThread,另一种是使用运
行库函数_beginthreadex(在process.h中声明)。两者的参数和效果是一样的,都
是给出一个函数的地址,入口参数,用于返回线程ID的指针,堆栈大小以及安全
属性(后面两个一般不特殊制定)。
下面看看线程对象是如何抽象线程的。
首先,有一个与线程对象在一起的全局函数:
DWORD WINAPI doRunWorking( LPVOID lpParm);
这个全局函数将用来创建真正的线程。
然后,从线程对象的构造函数开始,除了做必要的准备工作以外主要的工作就是
创建线程,以doRunWorking作为函数地址,以对象的this指针做参数创建线程,
并且线程的初始状态是CREATE_SUSPENDED(挂起)也就是说,线程创建之后不是
立刻就运行,一直到调用Run(它使用ResumeThread这个API从新启动线程)这个
成员函数才开始线程运行。
现在,看看运行了到线程执行了什么动作:
ThreadObject * p = (ThreadObject*)lpParm ;
if(p)
p->Working();
可以看到它从lpParam得到线程对象的指针,然后调用成员函数Working,这样,
线程的执行控制权辗转又回到了线程对象的手中,doRunWorking这个函数仅仅起
了一个搭桥的作用。
最后,在对象对析构函数中,结束线程。
到此可以看到线程对象是对线程对一直抽象,从对象创建开始线程被创建,从调
用Run函数开始线程运行,当对象不在生存当时候,线程也就自动终止。线程要做
当实际工作在Working这个函数中。