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

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


一、创建线程                   


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

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


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


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

注意当用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;

}



 

 

你可能感兴趣的:(Win32)