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


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

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

该回答引用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时,对象将被删除。

这里,在我的理解里面,CreateThread仅仅表示创建了内核对象,而只有当它的函数 lpStartAddress执行完毕后,才算是访问了它
即,它的线程函数执行完毕后,才算是访问了这个内核对象,但是AI告诉我的答案是当创建了,并且访问了,看不懂了