线程的handle是指向“线程核心对象”,而不是指向线程本身,对大部分API而言,这项差异没什么影响。当你调用CloseHandle()并给予它一个线程handle时,你只不过是表示,你希望自己和此核心对象不再有任何瓜葛。CloseHandle()唯一做的事情就是把引用计数减一。如果该值变成0,对象会自动被操作系统摧毁。
“线程核心对象”引用到的那个线程也会令核心对象开启。因此,线程对象的默认引用计数是2。
当你调用CloseHandle()时,引用计数下降1,当线程结束时,引用计数再降1.只有当两件事情都发生了(不管顺序如何)的时候,这个对象才会被真正清除。
“引用计数”机制保证新的线程有个地方可以写下其返回值。这样的机制也保证旧线程能够读取那个返回值-----只要它没有调用CloseHandle()。
由于被CreateThread()传回的那个handle属进程所有,而非线程所有,
所以很可能有一个新产生的线程调用CloseHandle(),取代原来的线程。Microsoft Visual C++ runtime library、中的_beginthread()就是这么做的。