2009-11-17 3 views
5

Я использую статическую библиотеку; он имеет функцию, которая использует текущее время и создает уникальный идентификатор, который затем вставляется в мою базу данных. Это число должно быть уникальным в моей таблице базы данных.Уникальны ли нити и процессы?

Существует два процесса, выполняющихся параллельно. Иногда они одновременно называют эту функцию, и генерируется одинаковое число. Когда это происходит, я получаю нарушение целостности.

Я подумываю использовать идентификатор процесса, идентификатор потока и текущее время. Является ли эта комбинация уникальной?

Платформа: Windows XP

ответ

10

Используйте базу данных, чтобы сгенерировать их. Как это сделать, зависит от базы данных, но Postgres calls them sequences для примера.

5

Идентификатор процесса/потока будет уникальным, если программы выполняются одновременно, так как ОС должна их различать. Но система повторно использует идентификаторы. Итак, для вашей ситуации, да, это хорошая идея добавить идентификатор процесса или идентификатор потока в ваш маркер, поэтому я не думаю, что вам нужны оба.

1

Хотя идентификатор процесса и идентификатор потока будут уникальными, было бы лучше использовать базу данных для создания уникального идентификатора для вас (как предлагает Р. Пате), хотя бы потому, что вы потенциально ограничиваете свою масштабируемость, за исключением случаев, когда вы также включаете уникальный идентификатор машины ...

Хотя, вероятно, маловероятно, что один из ваших процессов, запущенных на машине A, будет иметь тот же идентификатор процесса и идентификатор потока, что и один из ваших процессов на машине B, которые всегда являются видами ошибок, которые в конечном итоге выталкивают людей из постели в 4 часа ночи, чтобы справиться с поддержкой ...

0

Ну, добавление идентификатора процесса и идентификатора потока может привести к тому же номеру

PID = 100, TID = 104 PID = 108, TID = 96

Не вполне вероятно, но возможно.

Так для близких безопасных идентификаторов, вам потребуется по меньшей мере 64 разрядное поле идентификатора как

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

(однако, это еще не гарантирует уникальность, как он предполагает, что нить идентификаторы не перекрывают друг друга в путь с идентификаторами процесса, которые нейтрализуют 16-битные значения, но я не думаю, что когда-либо видел PID более 65536, и если вы не создаете тысячи потоков, идентификаторы потоков не будут обтекать это значение до того, как произойдет переход к отметке времени).

3

Сочетание идентификатора процесса, идентификатора потока и времени, к сожалению, не гарантирует уникальность. ОС может повторно использовать идентификаторы процессов и идентификаторы потоков, как только потоки и процессы, на которые они ссылались, прекратили действие. Кроме того, пользователь может установить часы назад, поэтому одно и то же время происходит дважды. Как говорили другие, я бы запросил базу данных для уникального идентификатора. Oracle имеет последовательности, MySQL имеет автоинкрементные столбцы, другие базы данных имеют аналогичные механизмы.

5

В Windows идентификаторы потоков уникальны во всей системе. Смотрите эту библиотеку статью MSDN:

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

функции CreateThread и CreateRemoteThread также возвращает идентификатор, который однозначно идентифицирует поток по всей системе. Поток может использовать функцию GetCurrentThreadId для получения собственного идентификатора потока.Идентификаторы действительны с момента создания потока до тех пор, пока поток не будет прерван. Обратите внимание, что ни один идентификатор потока никогда не будет 0.

+0

+1 Хорошее объяснение :) – Darren

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