hThread = CreateThread(... , &threadId);
当调用了 CreateThread CreateFile 等创建内核对象的函数后,
这里实则发生两件事:创建了一个内核对象和创建线程的函数打开(访问)了此对象,\
所以内核对象的引用计数加 1,
这时引用计数就为 2 了。
创建的时候为1,但是我没理解,创建线程的函数打开此对象是什么意思?这里
只提供了一句代码,就是hThread = CreateThread(... , &threadId);
这里的计数到底是1呢还是2呢?该怎么理解这段话
该回答引用ChatGPT4与博主@晓码自在合作编写:
当调用CreateThread等创建内核对象的函数时,发生了两件事:
创建了内核对象(线程对象)
创建线程的函数本身也打开(访问)了这个内核对象
所以,内核对象的引用计数变为2。
举个例子:
c
HANDLE hThread = CreateThread(...);
这行代码做了两件事:
调用CreateThread创建了一个线程对象(内核对象)
hThread = CreateThread这句代码本身也打开(引用)了这个线程对象,将其句柄存入hThread变量
因此,线程对象的引用计数变为2:
1 - 原本创建时的引用计数为1
2 - hThread变量引用了线程对象,引用计数+1
所以对这段代码来说,线程对象的引用计数是2,不是1。
总结一下:
当使用函数创建内核对象(如线程、文件等)时,会发生两件事:
所以实际的引用计数是2,而不是1。
这是Windows下理解内核对象引用计数的一个重要概念。内核对象的引用计数决定了其生命周期,当引用计数变为0时,对象将被删除。
这里,在我的理解里面,CreateThread仅仅表示创建了内核对象,而只有当它的函数 lpStartAddress执行完毕后,才算是访问了它
即,它的线程函数执行完毕后,才算是访问了这个内核对象,但是AI告诉我的答案是当创建了,并且访问了,看不懂了