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


一、创建线程                   


与调用函数的过程类似;线程只不过用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;
}