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