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

发布于:2021-05-15 06:44:07

先贴上运行结果(不知道为嘛下面不能贴图)


#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,这样该线程的内核对象就不会被释放,这泥萌可以忍受浪费资源

相关推荐

最新更新

猜你喜欢