线程和流程ID是否独一无二?

时间:2009-11-17 15:42:13

标签: c++ windows multithreading

我正在使用静态库;它有一个使用当前时间并创建唯一ID的函数,然后将其插入到我的数据库中。这个数字在我的数据库表中应该是唯一的。

有两个进程并行运行。有时它们会同时调用此函数,并生成相同的数字。发生这种情况时,我会违反完整性。

我正在考虑使用进程ID,线程ID和当前时间。这种组合是独一无二的吗?

平台:Windows XP

6 个答案:

答案 0 :(得分:10)

使用数据库生成它们。如何做到这一点取决于数据库,但Postgres将它们称为序列。

答案 1 :(得分:5)

如果程序同时运行,则进程/线程ID将是唯一的,因为操作系统需要区分它们。但系统确实重用了id。 所以,对于你的情况,是的,将一个进程ID或线程id添加到你的标记中是一个好主意,所以我认为你不需要两者。

答案 2 :(得分:5)

在Windows上,线程ID在整个系统中都是唯一的。请参阅此MSDN库文章:

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

CreateThread和CreateRemoteThread函数还返回一个标识符,该标识符唯一标识整个系统中的线程。线程可以使用GetCurrentThreadId函数来获取自己的线程标识符。标识符从创建线程到线程终止之间有效。请注意,没有线程标识符将为0。

答案 3 :(得分:3)

遗憾的是,进程ID,线程ID和时间的组合并不保证是唯一的。一旦他们引用的线程和进程终止,OS就可以重用进程ID和线程ID。此外,用户可以将时钟设置回来,因此同一时间发生两次。正如其他人所说,我会向数据库询问一个唯一的ID。 Oracle有序列,MySQL有自动增量列,其他数据库有相似的机制。

答案 4 :(得分:1)

虽然进程ID和线程ID将是唯一的,但最好使用数据库为您生成唯一ID(如R. Pate建议的那样),只是因为您可能会限制您的可伸缩性,除非您还包括独特的机器ID ...

尽管在机器A上运行的某个进程可能与在机器B上运行的进程之一具有相同的进程ID和线程ID,但这些错误最终会让人们起床凌晨4点来处理支持电话......

答案 5 :(得分:0)

好吧,添加进程ID和线程ID可能会导致相同的数字

pid = 100,tid = 104 pid = 108,tid = 96

不太可能,但可能。

因此,对于近乎安全的ID,您至少需要64位ID字段,如

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

(但是,这仍然不能保证唯一性,因为它假设线程ID不会与进程ID重叠,它们会中和16位值,但我认为我没有看到超过65536的PID,除非你创建了数千个线程,在时间戳跳转之前,线程ID不会在此值中回转。)