gpt4 book ai didi

c++ - CloseHandle 混淆 - 我必须在句柄的多个 "copies"上调用 CloseHandle 吗?

转载 作者:行者123 更新时间:2023-11-28 03:53:57 26 4
gpt4 key购买 nike

我有一些(更多)关于调用 CloseHandle 的问题。

所以,the SO citizens have spoken, and you must always close a handle .

问题一

我在析构函数中编写了以下代码片段:

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] );

上面的代码是否有效,或者我必须分别对每个 handle 成员变量调用 CloseHandle()?

例如

if( m_hCtrlThread != INVALID_HANDLE_VALUE )
CloseHandle( m_hCtrlThread );

我想这个问题(模糊地)链接到问题 2...

问题二

我有一个创建事件句柄的类:

HANDLE hEventAbortProgram = CreateEvent( NULL, TRUE, FALSE, NULL );

这个句柄在其他对象的其他线程之间共享。

通过共享句柄,我的意思是:

objectB.m_hEventAbort = objectA.m_hEventAbort;

然后每个对象的线程将执行如下操作:

while( WaitForSingleObject(m_hEventAbort, 0) == WAIT_TIMEOUT ) {...}

当事件发出信号时,所有线程都将退出。

我的问题是:我必须在句柄的每个拷贝上调用 CloseHandle,还是只在我的主“父”对象中调用一次?

我想我是在问 - 句柄在被复制时引用计数吗?

我知道句柄只是一个 void* 的类型定义,所以我的直觉告诉我不,我只需要为每个句柄调用一次。

最佳答案

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

如果不能保证共享一个句柄的对象的销毁顺序;你可以使用 DuplicateHandle从现有 handle 制作额外的 handle 。创建的每个额外句柄都需要关闭,句柄引用的基础对象只有在所有句柄都关闭后才会被释放。

关于c++ - CloseHandle 混淆 - 我必须在句柄的多个 "copies"上调用 CloseHandle 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4344202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com