У меня есть несколько (больше) вопросов о том, как позвонить в 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 для каждой копии дескриптора или только один раз в моем главном «родительском» объекте?
Полагаю, я спрашиваю - учитываются ли ссылки на дескрипторы, когда они копируются?
Я знаю, что дескриптор - это только определение типа для пустоты *, поэтому мой инстинкт говорит нет, мне нужно вызывать его только один раз для каждого дескриптора.