Re: hThreadParent - Проблема с Псевдоописателями потока
От: EreTIk EreTIk's Box
Дата: 28.06.11 17:39
Оценка: 2 (1)
G>Пожалуйста объясните чем отличается так сказать псевдоописатель от настоящего описателя, ведь если грубо говоря описател потока шестнадцатеричная число 0x78453214 то GetCurrentThread() возвращает именно этот адресс (число и хендл как хотите) в чем проблема ?
В Windows есть 2-а зарезервированных значения (константы) описателя ([i]"псевдоописателя"[i]):

А в приведенном коде значение 0xfffffffe ( ==(HANDLE)(LONG_PTR)-2 ) было передано в дочернюю нить (а не 0x78453214), которая по этому зарезервированному значению получила объект себя же в вызове GetThreadTimes().
hThreadParent - Проблема с Псевдоописателями потока
От: graviton9  
Дата: 28.06.11 17:05
Оценка:
В знаменитой книге Похтера по api в конце главы 6 есть один примерчик "Преобразование псевдоописателя в настоящий описатель" вот содержание:

<<Иногда бывает нужно выяснить настоящий, а не псевдоописатель потока. Под "настоящим" я подразумеваю описатель, который однозначно идентифицирует уникальный поток. Вдумайтесь в такой фрагмент кода:


DWORD WINAPI ParentThread(PVOID pvParam) 
{ 
HANDLE hThreadParent = GetCurrentThread(); 
CreateThread(NULL, 0, ChildThread, (PVOID) hThreadParent, 0, NULL); 

// далее следует какой-то код 
} 

DWORD WINAPI ChildThread(PVOID pvParam) 
{ 
HANDLE hThreadParent = (HANDLE) pvParam;

FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime;

GetThreadTimes(hThreadParent, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime); 

// далее следует какой-ro код. 
}



Вы заметили, что здесь не все ладно. Идея была в том, чтобы родительский поток передавал дочернему свой описатель. Но он передает псевдо-, а не настоящий описатель. Начиная выполнение, дочерний поток передает этот псевдоописатель функции GetThreadTimes, и она вследствие этого возвращает временные показатели своего — а вовсе не родительского потока. Происходит так потому, что псевдоописатель является описателем текущего потока, т.e. того, который вызывает эту функцию.>>


Пожалуйста объясните чем отличается так сказать псевдоописатель от настоящего описателя, ведь если грубо говоря описател потока шестнадцатеричная число 0x78453214 то GetCurrentThread() возвращает именно этот адресс (число и хендл как хотите) в чем проблема ?
Re[2]: hThreadParent - Проблема с Псевдоописателями потока
От: EreTIk EreTIk's Box
Дата: 28.06.11 17:43
Оценка:
В качестве примера можно посмореть код функции kernel32!GetCurrentThread() из XP:
; GetCurrentThread:
  push        -2
  pop         eax
  retn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.