如下创建一个线程的程序:
HANDLE hThread = CreateThread(NULL,0,AThread,&conn,0,NULL);
if(hThread != NULL)
{
CloseHandle(hThread);
}
我的理解是:在创建HANDLE hThread = CreateThread(NULL,0,AThread,&conn,0,NULL);后,AThread就开始执行,而后面的CloseHandle(hThread);是将线程的引用记数减一,
这样当AThread中return 0后,线程结束,整个线程就不再占用资源了。
在下的疑问是if(hThread != NULL)是不是要等AThread执行完后才执行?还是马上就能
执行?
在下初学,希望各位相助。

解决方案 »

  1.   


    不会等待线程执行完毕。
    创建线程之后执行该句判断,如果为空关闭Hanlde.
      

  2.   

    CreateThread function make reference count +2,CloseHandle only make reference count -1,when thread function finished, system will make reference count -1.
    but if you use AfxBegineThread(),you need not closeHandle,MFC do it for you!
    (my english is poor!but my computer can't use English. sorry)
      

  3.   

    那么是不是说如果hThread不为空,现在CloseHandle(hThread);就是将线程引用记数减一了,而并不是关闭这个线程?
      

  4.   

    hThread不用手工关闭。多此一举。
      

  5.   

    The thread object remains in the system until the thread has terminated and and and and and and and and and all handles to it have been closed through a call to CloseHandle. 
      

  6.   

    如果不用关闭的话,在下的判断并且close就是多此一举了。不过,我上面的编写方式运行没有问题呀。
      

  7.   

    CloseHandle(hThread);只是切断了父线程与子线程之间的联系,也就是说使hThread失效,并不影响子线程的运行。
      

  8.   

    HANDLE hThread = CreateThread(NULL,0,AThread,&conn,0,NULL);只是生成一个线程内核对象而已。生成以后系统给它在它所在的进程的地址空间内分配它的堆栈。同时设定它的引用记数为1。CloseHandle(hThread);只是把线程的引用记数减1,当引用记数减为0的时候,线程自己就关闭。
      

  9.   

    主线程函数如下HANDLE hThread = CreateThread(NULL,0,AThread,&conn,0,NULL);
    MessageBox("主线程结束");辅助线程如下:
    ::Sleep(5000);
    AfxMessageBox("辅助线程开始");大家说说  是先出现“主线程结束”对话框 还是先出现“辅助线程开始”对话框。
      

  10.   

    context switch
    天知道是什么结果
      

  11.   

    The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle. 
    ——————————————————————————
    先结束线程后CLOSEHANDLE,先CLOSEHANDLE后结束线程是一样的。
      

  12.   

    context switch
    天知道是什么结果我同意这句话,微软肯定对自己的context switch算法保密。
      

  13.   

    使用这个语句(CloseHandle(hThread);)两次,如果线程关闭了,不就说明问题了吗?
      

  14.   

    creatthread调用后系统会在内核维护一个线程对象,closehandle只是关闭了一个对这个对象引用的句柄,并不是直接杀死这个线程对象。当线程运行完成时,系统内核会根据对象的引用数,消除这个线程对象。或者父线程通过系统调用,通过内核直接杀死这个线程对象。一般来说线程对应一个线程对象,这些都是系统内核在维护的。
      

  15.   

    closehandle只是关闭了一个对这个对象引用的句柄,并不是直接杀死这个线程对象HANDLE hThread = CreateThread(NULL,0,AThread,&conn,0,NULL);
    if(hThread != NULL)
    {
    CloseHandle(hThread);
    }/////////////////
    从以上代码看,好象hThread这个句丙并没有任何作用呀。。
    仅仅起到判断线程创建成功与否而已。。