hThread = CreateThread(... , &threadId);
当调用了 CreateThread CreateFile 等创建内核对象的函数后,
这里实则发生两件事:创建了一个内核对象和创建线程的函数打开(访问)了此对象,\
所以内核对象的引用计数加 1,
这时引用计数就为 2 了。
创建的时候为1,但是我没理解,创建线程的函数打开此对象是什么意思?这里
只提供了一句代码,就是hThread = CreateThread(... , &threadId);
这里的计数到底是1呢还是2呢?该怎么理解这段话

这里的计数到底是1呢还是2呢
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- @晓码自在 2023-05-24 17:14关注
该回答引用ChatGPT4与博主@晓码自在合作编写:
当调用CreateThread等创建内核对象的函数时,发生了两件事:
创建了内核对象(线程对象)
创建线程的函数本身也打开(访问)了这个内核对象
所以,内核对象的引用计数变为2。
举个例子:
c HANDLE hThread = CreateThread(...);
这行代码做了两件事:
调用CreateThread创建了一个线程对象(内核对象)
hThread = CreateThread这句代码本身也打开(引用)了这个线程对象,将其句柄存入hThread变量
因此,线程对象的引用计数变为2:
1 - 原本创建时的引用计数为1
2 - hThread变量引用了线程对象,引用计数+1所以对这段代码来说,线程对象的引用计数是2,不是1。
总结一下:
当使用函数创建内核对象(如线程、文件等)时,会发生两件事:
- 创建内核对象,其引用计数变为1
- 函数本身也访问(打开)了该内核对象,引用计数+1
所以实际的引用计数是2,而不是1。
这是Windows下理解内核对象引用计数的一个重要概念。内核对象的引用计数决定了其生命周期,当引用计数变为0时,对象将被删除。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报