2009-11-17 9 views
5

Używam biblioteki statycznej; ma funkcję, która wykorzystuje bieżący czas i tworzy unikalny identyfikator, który następnie jest wstawiany do mojej bazy danych. Ten numer powinien być unikalny w mojej tabeli bazy danych.Czy identyfikatory wątków i procesów są unikatowe?

Istnieją dwa procesy uruchomione równolegle. Czasami jednocześnie wywołują tę funkcję i generowany jest ten sam numer. W takim przypadku otrzymuję naruszenie integralności.

Mam zamiar użyć identyfikatora procesu, identyfikatora wątku i bieżącego czasu. Czy ta kombinacja jest wyjątkowa?

Platforma: Windows XP

Odpowiedz

5

Identyfikator procesu/wątku będzie unikalny, jeśli programy będą działać jednocześnie, ponieważ system operacyjny musi je rozróżnić. Ale system ponownie wykorzystuje identyfikatory. Tak więc, dla twojej sytuacji, tak, dobrym pomysłem jest dodanie identyfikatora procesu lub identyfikatora wątku do znacznika, chociaż nie sądzę, że potrzebujesz obu.

1

Podczas gdy identyfikator procesu i identyfikator wątku będą niepowtarzalne, lepiej będzie użyć bazy danych do wygenerowania unikalnego identyfikatora (jak sugeruje R. Pate), tylko dlatego, że potencjalnie ograniczasz swoją skalowalność, chyba że uwzględnisz również unikalny identyfikator maszyny również ...

Chociaż prawdopodobnie jest mało prawdopodobne, że jeden z procesów uruchomionych na komputerze A będzie miał ten sam identyfikator procesu i identyfikator wątku, co jeden z procesów uruchomionych na komputerze B, które zawsze są tymi rodzajami błędów, które powodują, że ludzie wychodzą z łóżka o 4 nad ranem, aby poradzić sobie z wezwaniem pomocy technicznej ...

0

Cóż, dodanie identyfikatora procesu i identyfikatora wątku może prowadzić do tego samego numeru

PID = 100, tid = 104 PID = 108, tid = 96

nie jest całkiem prawdopodobne, ale możliwe.

Więc dla blisko bezpiecznych identyfikatorów, musisz przynajmniej pole ID 64 trochę jak

ULONG64 id = ((ULONG64)(pid&0xffff) << 48) | ((ULONG64)(tid&0xffff) << 32) | (timestamp & 0xffffffff); 

(to jednak nadal nie gwarantuje niepowtarzalność, gdyż zakłada, że ​​identyfikatory gwint nie pokrywają się w sposób sposób z identyfikatorami procesów, które neutralizują wartości 16-bitowe, ale nie sądzę, żebym kiedykolwiek widział PID powyżej 65536 i dopóki nie utworzysz tysięcy wątków, identyfikatory wątków nie zawiną się w tej wartości przed skokiem znacznika czasu).

3

Połączenie identyfikatora procesu, identyfikatora wątku i czasu nie jest niestety gwarantowane. System operacyjny może ponownie użyć identyfikatorów procesów i identyfikatorów wątków po zakończeniu wątków i procesów, do których się odwołały. Ponadto użytkownik może ustawić zegar z powrotem, więc ten sam czas wystąpi dwukrotnie. Jak powiedzieli inni, poprosiłbym bazę danych o unikalny identyfikator. Oracle ma sekwencje, MySQL ma kolumny auto-inkrementacji, inne bazy danych mają podobne mechanizmy.

5

W systemie Windows identyfikatory wątków są unikalne w całym systemie. Zobacz ten artykuł MSDN Library:

http://msdn.microsoft.com/en-us/library/ms686746%28v=VS.85%29.aspx

Funkcje CreateThread i CreateRemoteThread również zwrócić identyfikator, który jednoznacznie identyfikuje wątek w całym systemie. Wątek może korzystać z funkcji GetCurrentThreadId, aby uzyskać własny identyfikator wątku.Identyfikatory są ważne od momentu utworzenia wątku do momentu zakończenia wątku. Pamiętaj, że żaden identyfikator wątku nigdy nie będzie równy 0.

+0

+1 Przyjemne wyjaśnienie :) – Darren

Powiązane problemy