• CloseHandel(_beginthreadex): 只是关闭了线程句柄对象,并不会结束线程。


    今天在测试程序的时候,在【任务管理器】中发现进程序的句柄随着多线程的不断运行,会不断的 +1。

    发现原来在我的代码中,启动线程后都没有显式的调用 CloseHandle() 来关闭线程句柄。

    当我准备写关柄句柄的代码时,我有个疑问,如果线程还没有结束的时候,使用 CloseHandle() 来关闭线程句柄,是否会影响线程的运行呢?

    百度了一下,找到答案:https://blog.csdn.net/rainminism/article/details/8509857

    内容就直接复制过来,也不算多:

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    _beginthreadex 函数返回一个线程句柄 

    返回这个handle是为了让你有机会对这个线程实施外部动作,诸如waitforsingleobject之类。 

     

    CloseHandel(_beginthreadex);

    只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

     

    CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄,而_endthreadex的功能是终止一个线程,它所接受的参数是一个线程的退出码。   
        
    通过调用CloseHandle可以告知系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址,把结构中的使用计数成员减1,如果计数变为0,则将从内核中释放该内核对象。如果计数还未到0,就意味着还有其他的进程在使用这个内核对象,那么它就不会被释放。   

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    下面是改进后的代码:

    HANDLE hThread = (HANDLE) _beginthreadex(NULL, 0, thread_worker, NULL, 0, NULL);
    if(hThread != NULL)
    {
        CloseHandle(hThread); //只是关闭线程句柄, 并没有结束线程.
    }

    这样每次启动线程后,进程中的句柄不会 +1

  • 相关阅读:
    回溯算法总结
    第四章总结
    第四章编程总结
    动态规划总结:
    第三章实践心得
    分治算法体会
    第二章上机实践总结
    代码规范与《数学之美》读后感
    第二次c++作业
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/personnel/p/9627098.html
Copyright © 2020-2023  润新知