Windows线程(6)

来源:互联网 发布:php可以编译吗 编辑:程序博客网 时间:2024/06/07 22:08

      线程有两个组成部分:1.线程内核对象,操作系统用它管理线程内核对象,还在其中存放入一些线程统计信息。

                                          2.线程栈,用于维护线程执行时所需的所有函数参数和局部变量。

      进程是不执行任何操作的,它只是线程的一个容器。如果一个进程有两个以上的线程运行,将意味着线程要在共享同一个地址空间。这些线程共享同样的代码、数据,还包括共享内核对象句柄。注意:线程需要的系统资源为一个“内核对象”和一个“栈”。


      线程的创建:初始化进程时,system会创建一个main线程。此线程调用运行库启动代码,后者调用入口点函数,并继续执行,直至入口点函数返回运行库启动代码,后者最终调用ExitProcess。

      要创建线程,需要先创建入口点函数,这时线程执行的起点。主线程的入口点函数_tmain、_tWinMain。那么自己创建的入口点函数形式如下:


DWORD WINAPI ThreadFUunc(PVOID pvParam){       ......       return 0;}

      当线程任务处理完后,会返回,此时线程终止,线程栈被销毁,线程内核对象计数递减,减为0则销毁。入口点函数的返回值会成为该线程的退出代码。


      创建线程的函数。1.调用CreateThread函数。此函数调用时,会创建一个线程内核对象。这个对象不是线程本身!这与进程和进程内核对象的关系是相同的。系统从进程的内存空间中分配内存给线程栈使用。新线程和负责创建的那个线程在相同的进程空间上下文中运行。所以,新线程可以访问进程对象的所有句柄、内存以及同一进程中其他所有线程的栈。

      不能使用两个线程来执行同一个函数。

 

      终止线程:1.线程函数返回。

                        2.调用ExitThread函数

                        3.调用TerminateThread函数(如果调用其,线程的栈将会不被销毁,只能是进程终止时由系统回收)

                        4.线程的进程终止


      线程终止时:1.一个线程会销毁由线程安装和创建的所有窗口,并卸载销毁任何挂钩。其他对象只有在拥有线程的进程终止时才被销毁。

                            2.退出码由STILL_ACTIVE变为ExitThread或TerminateThread的参数。

                            3.线程内核对象的状态变为触发状态。

                            4.如果线程是该进程中最后一个活动线程,系统默认进程终止。

                            5.线程内核对象使用计数递减1。(当使用计数为0时系统释放其,并销毁其)

      其他线程可以调用GetExitCodeThread函数来检查hThread所标识的那个线程是否已经终止运行了。如果已经终止,则可以判断其退出代码是什么:

BOOL GetExitCodeThread(     HANDLE hThread,     PDWORD pdExitCode);

      如果线程尚未终止,则用STILL_ACTIVE来标识,如果调用成功,就返回NULL。




原创粉丝点击