Ответ на этот вопрос можно найти в главе 6.8 «Программирование приложений для Microsoft Windows».
Получение чувства собственного достоинства
Иногда вам может понадобиться приобрести реальную ручку для потока вместо псевдо-ручка. Под «real» подразумевается дескриптор, который однозначно идентифицирует уникальный поток. Рассмотрим следующий код:
DWORD WINAPI ParentThread(PVOID pvParam) {
HANDLE hThreadParent = GetCurrentThread();
CreateThread(NULL, 0, ChildThread, (PVOID) hThreadParent, 0, NULL);
// Function continues...
}
DWORD WINAPI ChildThread(PVOID pvParam) {
HANDLE hThreadParent = (HANDLE) pvParam;
FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime;
GetThreadTimes(hThreadParent,
&ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime);
// Function continues...
}
Вы можете увидеть проблему с этим фрагментом кода? Идея состоит в том, чтобы родительский поток передавал дочернему потоку описатель потока, который идентифицирует родительский поток. Тем не менее, родительский поток передает псевдо-дескриптор, а не реальный дескриптор. Когда дочерний поток начинает выполняться, он передает псевдо-дескриптор функции GetThreadTimes, которая заставляет дочерний поток получать свои собственные времена процессора, а не процессорные времена родительского потока. Это происходит потому, что псевдо-дескриптор потока является дескриптором текущего потока, то есть дескриптором того, какой поток выполняет вызов функции.
Чтобы исправить этот код, мы должны превратить псевдо-ручку в настоящий дескриптор. Функция DuplicateHandle (обсуждается в главе 3), могут сделать это преобразование
Я не уверен, что вы просите. – SLaks
Зачем вам называть DuplicateHandle вместо того, чтобы просто получить дескриптор объекта, как обычно? –