多线程CreateThread()之后,CloseHandle()为什么不会直接关闭线程。

先贴上运行结果(不知道为嘛下面不能贴图)
多线程CreateThread()之后,CloseHandle()为什么不会直接关闭线程。_第1张图片

#include
#include
using namespace std;

DWORD WINAPI Thread2(
    LPVOID lpParameter
    );

int counter = 0;
int main() {

    HANDLE handle = NULL;
        handle = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);
        CloseHandle(handle);
        //while(counter++<1000)
        cout << "the main thread is running!   " <return 0;
}

DWORD WINAPI Thread2(
    LPVOID lpParameter
    ) {
    //while(counter++<1000)
    cout << "the thred222222 is running!  " << endl;
    return 0;
}

问题分析:
调用CloseHandle()函数会减少线程内核对象的引用计数,如果引用计数减为0,则撤消该内核对象。

最初的想法:
在调用CreateHandle创建线程之后,线程内核对象的引用计数不为1,再CloseHandle就会使其引用计数减至0,系统就会销毁该内核对象, 那为什么一般要立即执行CloseHandle()函数呢

MSDN解释:
Closing a thread handle does not terminate the associated thread or remove the thread object. Closing a process handle does not terminate the associated process or remove the process object. To remove a thread object, you must terminate the thread, then close all handles to the thread. For more information, see Terminating a Thread.

CSDN大神解释:
事实上,CreateThread函数会对其创建的thread内核对象产生两个引用,一个是线程调度组件对其的引用另一个是返回个线程创建者的句柄,等等其他的资源句柄,所以计数器的值应该是>=2,也就是说,关闭CreateThread函数返回的句柄,计数器的任然是>=1的,并不会导致相应的线程被终止,反而减少系统的负担,而相应的内核对象则需要在线程退出,且其对应的内核对象的引用计数为0时,才会被清除。
所以,多线程CreateThread()之后,CloseHandle()为什么会直接关闭线程。

/————————————–分割线——————————/
追加-。-要调用CloseHandle()的原因:
  我们知道,当创建的这个新线程执行完毕后,系统也会递减该线程的内核对象的使用计数。当计数为0时,系统就会释放该线程的内核对象。
  喋么,but~,如果没有关闭线程句柄,系统会一直保持着对线程的内核对象的引用,也就是说,系统在进程结束前,不具有主动释放线程句柄的权利,那么,即使线程执行完毕,它的计数引用任然不会为0,这样该线程的内核对象就不会被释放,这泥萌可以忍受浪费资源

你可能感兴趣的:(Notes)