首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2013-10-08 
win32多线程程序设计笔记(第二章)第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点。一、创

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;}


热点排行