Win32多线程程序设计-读书笔记-核心对象

核心对象与GDI对象很相似,又有不同,首先它由KERNEL32.DLL管理,而GDI对象由GDI32.DLL管理。

核心对象依靠HANDLE为使用时的参考依据,但是其HANDLE与GDI对象的HANDLE不同。GDI对象只有唯一的一个HANDLE,并只能被创建此对象的进程(或线程)所私有。而核心对象的HANDLE则可以有多个,甚至可以是跨进程的拥有这个对象。MSDN上面对核心对象的解释是Process Specific的,即一个进程(或线程)必须通过创建一个对象或者打开一个对象来得到它的HANDLE。这些不同的HANDLE可以描述对于同一个对象的不同权限。

HANDLE是什么?其实是一个指针,指向操作系统内存空间中的某样东西,该东西不允许你的程序直接取得

核心对象包括:

      进程Process;线程Thread;文件File;事件Event;信号量semaphore;互斥器mutex;管道pipe

为了保持对拥有者的跟踪,核心对象保持了一个引用计数Reference Count,记录多少HANDLE对应此对象;并同时记录了哪一个进程或者线程是这些Handle的拥有者。当调用CloseHandle函数时,计数就会-1,到0就会被释放。

进程或者线程结束时的Cleanup操作也会包括将它们所拥有的所有核心对象计数-1。但是该CloseHandle的时候就不应该依赖操作系统的Cleanup,例如开了几百个工作线程但是不CloseHandle,那么最后Cleanup面对的“资源泄漏”会给效率带来负面影响。并且,Cleanup并不了解这些对象的实际意义,因此也无法保证他们的解构顺序。

有一个重要的点在于:不能依赖“因线程的结束而清理其所产出的所有对象”,因为很多对象例如文件,是被进程拥有而不是线程,因此进程结束之前并不能结束。所以Cleanup操作结果要视对象真正的拥有者是线程还是进程。不过这不是由用户决定的。

P.S 线程的HANDLE并不是线程本身,而是指向“线程核心对象”。CloseHandle的调用只是表示自己与这个对象再没由瓜葛了。进程在创建线程时拥有了一个HANDLE,而这个HANDLE引用到的线程也会令核心对象开启,因此线程的默认计数是2,只有进程和线程本身都CloseHandle,才会真正清除这个核心对象。

posted @ 2008-10-14 01:11  gambell huang  阅读(388)  评论(0编辑  收藏  举报