win32多线程程序设计笔记(第二章)

来源:互联网 发布:淘宝网购物车 编辑:程序博客网 时间:2024/04/29 12:43

第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点。


一、创建线程                   


与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用被封装的函数。

HANDLE hThread = CreateThread (
             LPSECURITY_ATTRIBUTES lpThreadAtt,
             DWORD dwStackSize
             LPTHREAD_START_ROUTINE lpFun,
             LPVOID lpParameter,
             DWORD dwCreationFlags,
             LPDWORD lpThreadID)
    LpFun:就是指向被封装的函数的地址。
    LpParameter: 就是指向被封装的函数的参数(没有参数填入null)


下图为简单的函数调用和调用线程的过程:



注意当用CreateThread之后,产生的新的线程不会立即启动,执行的时间也是无法预期的


二、核心对象                      


           当调用CreateThread()后,会产生线程核心对象(如果已经产生了线程核心对象,那么就只将此核心对象的引用计数加1;另外,win32系统中有若干种核心对象),并以句柄handle指向它。那么,显然,在线程使用完毕后就应该用CloseHandle()函数关闭。

三、线程结束                      

         既然线程是独立的运行的程序,那么主程序如何知道线程执行完毕呢?
         答案是通过GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode)函数。如果线程已结束,那么线程结束的代码被放在lpExitCode参数中带回来,如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE。

例:
DWORD WINAPI ThreadFun(LPVOID n) //线程函数:{    return 10;}int main(){    hThrd = CreateThread(null,0,ThreadFun, …);    DWORD  exitCode=0;    for(  ;  ; ) {        GetExitCodeThread(hThrd,&exitCode);        if ( exitCode == STILL_ACTIVE){                   //线程仍然在运行        }        else{                   break;        }    }    //exitCode保存了函数的返回值    printf( “线程函数的返回值 : %d /n”, exitCode);    CloseHandle(hThrd);    return 0;}


原创粉丝点击