线程有两个组成部分: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。