求教 windows核心对象计数器有关问题
求教 windows核心对象计数器问题
在看win32多线程书的时候,提到:
核心对象有引用计数器,这个之前也了解到了,对于“每次你调用CloseHandle(),引用计数便减 1。”
那么 什么时候加1呢,引用的时候?难道是createmutex的时候加1吗?
核心对象不都是create之后返回句柄使用,最后就close了,意思是有多次的create?
难道是先记着所有创建的核心对象,最后系统一起销毁?(这话我都觉得不通)
发现这方面没理解,特来求助,谢谢。
------解决方案--------------------
createmutex的时候加1,closehandle的时候减1,减1之后如果ref count为0,实际内核对象会被销毁。这些都在系统内部完成,对于client来说是透明的。但是,client要保证两个函数的调用数量保持一致。
------解决方案--------------------
这个有点儿类似new和delete的关系,创建了一个句柄,分配在堆上,就要手动回收。
------解决方案--------------------
HANDLE thread_handle=CreateThread(...);
HANDLE thread_cpy=new HANDLE(thread_handle);
复制了一次
------解决方案--------------------
核心对象不都是create之后返回句柄使用,最后就close了,意思是有多次的create?
核心对象一般是可以跨进程,
一个进程创建对象,计数为1,
如果另外的进程使用了此对象,则计数为2
第一个进程close后,计数为1,对象继续存在
第二个进程close,计数为0,对象销毁
可看看《Windows核心编程》
------解决方案--------------------
那要是一个数组里有两份HANLDE的Copy,一个被Close了,另一个怎么办
------解决方案--------------------
那要引用计数干嘛,有闲心调用函数增加引用计数还不如不要close呢。。
。。等等。。WinAPi好像是用C写的。。谈论这个更本就没有意义
------解决方案--------------------
把handle看成new出来的对象就行了,new出来一个对象,即使你把对象指针赋值给两个指针变量,只要delete其中一个,两个同时都失效。但是一般情况下你又不能不delete它。
在看win32多线程书的时候,提到:
当你不再需要一个 mutex 时,你可以调用 CloseHandle() 将它关闭。和其
他核心对象一样,mutex 有一个引用计数(reference count)。每次你调用
CloseHandle(),引用计数便减 1。当引用计数达到0 时,mutex 便自动被系统清
除掉。下
核心对象有引用计数器,这个之前也了解到了,对于“每次你调用CloseHandle(),引用计数便减 1。”
那么 什么时候加1呢,引用的时候?难道是createmutex的时候加1吗?
核心对象不都是create之后返回句柄使用,最后就close了,意思是有多次的create?
难道是先记着所有创建的核心对象,最后系统一起销毁?(这话我都觉得不通)
发现这方面没理解,特来求助,谢谢。
------解决方案--------------------
createmutex的时候加1,closehandle的时候减1,减1之后如果ref count为0,实际内核对象会被销毁。这些都在系统内部完成,对于client来说是透明的。但是,client要保证两个函数的调用数量保持一致。
------解决方案--------------------
这个有点儿类似new和delete的关系,创建了一个句柄,分配在堆上,就要手动回收。
------解决方案--------------------
HANDLE thread_handle=CreateThread(...);
HANDLE thread_cpy=new HANDLE(thread_handle);
复制了一次
------解决方案--------------------
核心对象不都是create之后返回句柄使用,最后就close了,意思是有多次的create?
核心对象一般是可以跨进程,
一个进程创建对象,计数为1,
如果另外的进程使用了此对象,则计数为2
第一个进程close后,计数为1,对象继续存在
第二个进程close,计数为0,对象销毁
可看看《Windows核心编程》
------解决方案--------------------
那要是一个数组里有两份HANLDE的Copy,一个被Close了,另一个怎么办
------解决方案--------------------
那要引用计数干嘛,有闲心调用函数增加引用计数还不如不要close呢。。
。。等等。。WinAPi好像是用C写的。。谈论这个更本就没有意义
------解决方案--------------------
把handle看成new出来的对象就行了,new出来一个对象,即使你把对象指针赋值给两个指针变量,只要delete其中一个,两个同时都失效。但是一般情况下你又不能不delete它。