【问题标题】:CloseHandle confusion - Must I call CloseHandle on multiple "copies" of a handle?CloseHandle 混淆 - 我必须在句柄的多个“副本”上调用 CloseHandle 吗?
【发布时间】: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 进行簿记。

标签: c++ windows winapi handle


【解决方案1】:

回答 1 你上面的代码是有效的。但我建议您检查当前索引“下”的句柄是否是有效句柄。

答案 2 如果你共享这个句柄没有重复,没有引用计数等,你只需要关闭它一次,它将无效。

【讨论】:

  • ?...只是一个建议^^...这能回答你的问题吗?:)
【解决方案2】:

至问题 2:对 CloseHandle 的调用次数应平衡对处理创建函数的调用次数。 如果您只是将句柄分配给另一个 HANDLE 变量,则您还没有创建新句柄 - 这两个句柄具有相同的值。 您可以根据需要共享句柄值,但只有一个对象最终必须关闭句柄。

如果不能保证共享句柄的对象的销毁顺序;您可以使用DuplicateHandle 从现有句柄制作额外的句柄。创建的每个附加句柄都需要关闭,并且只有在所有句柄都关闭时才会释放句柄引用的底层对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多