【发布时间】:2011-05-19 15:43:58
【问题描述】:
我有一些(更多)关于调用 CloseHandle 的问题。
所以,the SO citizens have spoken, and you must always close a handle。
问题 1
我在析构函数中编写了以下代码 sn-p:
HANDLE handles[] = { m_hGrabberThread, m_hCtrlThread, m_hErrDispatchThread };
int nNumHandles = sizeof(handles) / sizeof(handles[0]);
for( int n = 0; n < nNumHandles; n ++ )
CloseHandle( handles[n] );
上面的代码是否有效,还是我必须在每个句柄成员变量上单独调用 CloseHandle()?
例如
if( m_hCtrlThread != INVALID_HANDLE_VALUE )
CloseHandle( m_hCtrlThread );
我想这个问题(模糊地)与问题 2 相关...
问题 2
我有一个创建事件句柄的类:
HANDLE hEventAbortProgram = CreateEvent( NULL, TRUE, FALSE, NULL );
此句柄在其他对象中的其他线程之间共享。
通过共享句柄,我的意思是:
objectB.m_hEventAbort = objectA.m_hEventAbort;
然后每个对象的线程将执行以下操作:
while( WaitForSingleObject(m_hEventAbort, 0) == WAIT_TIMEOUT ) {...}
当事件发出信号时,所有线程都将退出。
我的问题是:我必须在句柄的每个副本上调用 CloseHandle,还是只在我的主要“父”对象中调用一次?
我想我在问 - 句柄在复制时引用计数吗?
我知道句柄只是 void* 的 typedef,所以我的直觉说不,我只需要每个句柄调用一次。
【问题讨论】:
-
我怀疑打电话给
CloseHandle(INVALID_HANDLE_VALUE)会不会有什么坏处,那为什么还要检查呢? -
看看stackoverflow.com/questions/1562421/… ;您也许可以使用 Boost 进行簿记。