2015-06-28 2 views
2

Используя следующий код, взятый из here с некоторыми дополнениями для получения ручек потоков, OpenThread возвращает тот же дескриптор, но другой идентификатор для каждого потока процесса.OpenThread возвращает тот же дескриптор для разных потоков ID

#include <stdio.h> 
#include <windows.h> 
#include <tlhelp32.h> 

int __cdecl main(int argc, char **argv) 
{ 
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
HANDLE hThread; 
if (h != INVALID_HANDLE_VALUE) { 
    THREADENTRY32 te; 
    te.dwSize = sizeof(te); 
    if (Thread32First(h, &te)) { 
    do { 
    if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + 
         sizeof(te.th32OwnerProcessID)) { 
     hThread = OpenThread(THREAD_QUERY_INFORMATION, FALSE, te.th32ThreadID); 
     printf("Process 0x%04x Thread 0x%04x Handle %d\n", 
      te.th32OwnerProcessID, te.th32ThreadID, hThread); 
     CloseHandle(hThread); 
    } 
    te.dwSize = sizeof(te); 
    } while (Thread32Next(h, &te)); 
    } 
    CloseHandle(h); 
} 
return 0; 
} 

Некоторый выход:

Process 0x10fc Thread 0x2270 Handle 68 
Process 0x10fc Thread 0x13d4 Handle 68 
Process 0x10fc Thread 0x071c Handle 68 
Process 0x10fc Thread 0x2140 Handle 68 
Process 0x10fc Thread 0x20d4 Handle 68 
Process 0x1b70 Thread 0x21e8 Handle 68 
Process 0x1c7c Thread 0x1d18 Handle 68 
Process 0x1c7c Thread 0x10b8 Handle 68 
Process 0x0d84 Thread 0x1fa0 Handle 68 

Так как я должен использовать функции, которая требует дескриптора потока, если все они имеют один и тот же номер?

ответ

3

Если вам нужно держать ручку нити, не закрывайте ручку!

+0

Это имеет смысл: lol: Мысль о том, что ручка была уникальной. Спасибо дружище! – cdonts

+2

Ручка уникальна только при жизни. Как только он будет закрыт, его порядковый номер можно будет повторно использовать. –

Смежные вопросы