2012-12-10 11 views
14

Powiedz, jeśli mam identyfikator wątku, czy mogę mieć pewność, że będzie on unikatowy (tak długo, jak wątek jest uruchomiony) na proces lub w całym systemie operacyjnym (pośród wszystkich zalogowanych użytkowników)?Czy identyfikatory wątków są unikalne na proces lub na komputer?

+0

Gdy wiesz, że wątek może działać na różnych rdzeniach/procesorach podczas jego trwania i że ID pozostanie niezmieniony w tym czasie, możesz samemu wydedukować odpowiedź ;-) –

Odpowiedz

11

Tak, identyfikatory wątków i identyfikatory procesów w systemie Windows są przydzielane z tej samej puli, więc będą unikatowe. Jednak po zakończeniu wątku lub procesu identyfikator może zostać ponownie wykorzystany przez inny wątek lub proces.

+2

Tak, dziękuję. Wiem, że PID są wyjątkowe. Nie byłem pewien co do identyfikatorów wątków. – c00000fd

+0

Czy możesz rozwinąć swoją odpowiedź, aby wyjaśnić, jak często odzyskiwanie wątków i identyfikatory procesów są przetwarzane? –

+0

@ ChristopherOezbek Gdy tylko obiekt jądra zostanie zamknięty, jego identyfikator może zostać ponownie użyty. Tak więc jest to całkowicie możliwe: 'hThread1 = CreateThread (... &tid1); CloseHandle (hThread1); hThread2 = CreateThread (... &tid2); // tid1 == tid2, nawet hThread1 == hThread2' Chociaż teraz odnoszą się do innego jądra Obiekt: – parrowdice

8

Wątek jest reprezentowany przez obiekt jądra, np. na platformie Windows. Dlatego jego id będzie unikalny we wszystkich procesach we wszystkich sesjach logowania. Jednak identyfikatory wątków mogą zostać ponownie przetworzone po zamknięciu obiektu jądra wątku.

GetCurrentThreadId również wyraźnie mówi o unikalnym identyfikatorze podczas działania.

+0

Dzięki. Aby zabezpieczyć się przed odzyskiwaniem identyfikatorów wątków (jeśli wątek i jego uchwyt mogły zostać zamknięte podczas śledzenia tego identyfikatora wątku), można go powiązać z tworzeniem wątku FILETIME, które można uzyskać za pomocą funkcji API GetThreadTimes() – c00000fd

+0

@ user843732 : Zrobione we właściwy sposób, tak, możesz. Korzystam z tej techniki, aby sprawdzić, czy PID nadrzędnego procesu wskazuje na proces nadrzędny w porównaniu z procesem, który poddał recyklingowi PID rodzica. – parrowdice

+0

@parrowdice: Kolejne pytanie, chłopaki. Czas "FILETIME" zwrócony przez GetThreadTimes() API nie ma "jittera" związanego z zegarem, prawda? Dokumenty twierdzą, że wartość tworzenia wątku jest wyrażona w "100-nanosekundach t Ime jednostki "co jest strasznie precyzyjne! To nie spowoduje, że wewnętrzny timer zacznie zaokrąglać go za różne połączenia z tym API, prawda? – c00000fd

Powiązane problemy