雪傲天1 2023-05-24 16:54 采纳率: 96.2%
浏览 14
已结题

这里的计数到底是1呢还是2呢


hThread = CreateThread(... , &threadId);
当调用了 CreateThread CreateFile 等创建内核对象的函数后,
这里实则发生两件事:创建了一个内核对象和创建线程的函数打开(访问)了此对象,\
所以内核对象的引用计数加 1,
这时引用计数就为 2 了。

创建的时候为1,但是我没理解,创建线程的函数打开此对象是什么意思?这里
只提供了一句代码,就是hThread = CreateThread(... , &threadId);
这里的计数到底是1呢还是2呢?该怎么理解这段话
  • 写回答

2条回答 默认 最新

  • @晓码自在 2023-05-24 17:14
    关注

    该回答引用ChatGPT4与博主@晓码自在合作编写:

    当调用CreateThread等创建内核对象的函数时,发生了两件事:

    1. 创建了内核对象(线程对象)

    2. 创建线程的函数本身也打开(访问)了这个内核对象

    所以,内核对象的引用计数变为2。

    举个例子:

    c
    HANDLE hThread = CreateThread(...); 
    
    

    这行代码做了两件事:

    1. 调用CreateThread创建了一个线程对象(内核对象)

    2. hThread = CreateThread这句代码本身也打开(引用)了这个线程对象,将其句柄存入hThread变量

    因此,线程对象的引用计数变为2:

    1 - 原本创建时的引用计数为1
    2 - hThread变量引用了线程对象,引用计数+1

    所以对这段代码来说,线程对象的引用计数是2,不是1。

    总结一下:

    当使用函数创建内核对象(如线程、文件等)时,会发生两件事:

    1. 创建内核对象,其引用计数变为1
    2. 函数本身也访问(打开)了该内核对象,引用计数+1

    所以实际的引用计数是2,而不是1。

    这是Windows下理解内核对象引用计数的一个重要概念。内核对象的引用计数决定了其生命周期,当引用计数变为0时,对象将被删除。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月24日