Путаница с CloseHandle - Должен ли я вызывать CloseHandle для нескольких «копий» дескриптора? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть несколько (больше) вопросов о том, как позвонить в CloseHandle.

Итак, говорили граждане ТАК, и вы всегда должны закрывать ручку .

Вопрос 1

Я написал следующий фрагмент кода в деструкторе:

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

Этот дескриптор используется другими потоками в других объектах.

Byразделяя дескриптор, я имею в виду:

objectB.m_hEventAbort = objectA.m_hEventAbort;

Потоки каждого объекта будут тогда делать что-то вроде:

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

Когда событие будет сигнализировано, все потоки выйдут.

Мой вопрос: должен ли я вызывать CloseHandle для каждой копии дескриптора или только один раз в моем главном «родительском» объекте?

Полагаю, я спрашиваю - учитываются ли ссылки на дескрипторы, когда они копируются?

Я знаю, что дескриптор - это только определение типа для пустоты *, поэтому мой инстинкт говорит нет, мне нужно вызывать его только один раз для каждого дескриптора.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

К Вопросу 2: Количество вызовов в CloseHandle должно совпадать с количеством вызовов для обработки функций создания.Если вы просто назначаете дескриптор другой переменной HANDLE, вы не создаете новый дескриптор - оба дескриптора имеют одинаковое значение.Вы можете делиться значением дескриптора столько раз, сколько хотите, но только один объект должен в конечном итоге закрыть дескриптор.

Если вы не можете гарантировать порядок уничтожения объектов, использующих дескриптор;Вы можете использовать DuplicateHandle для создания дополнительных дескрипторов из существующего дескриптора.Каждый дополнительный созданный дескриптор должен быть закрыт, а базовый объект, на который ссылается дескриптор, будет освобожден только тогда, когда все дескрипторы будут закрыты.

0 голосов
/ 03 декабря 2010

Ответ 1 Ваш код выше действителен. Но я предлагаю вам проверить, является ли указатель «под» текущим индексом действительным указателем.

Ответ 2 Если вы делитесь этим дескриптором без дублирования и отсчета ссылок и т. Д., Вам нужно закрыть его только один раз, и он будет недействительным.

...