线程和进程ID是否唯一?

5
我正在使用一个静态库;它有一个函数,利用当前时间创建一个唯一的ID,然后将其插入到我的数据库中。该数字应在我的数据库表中是唯一的。
有两个并行运行的进程。有时它们同时调用此函数,并生成相同的数字。当这种情况发生时,我会收到完整性违规的通知。
我考虑使用进程ID、线程ID和当前时间。这个组合是唯一的吗?
平台:Windows XP
6个回答

10
使用数据库来生成它们。如何实现取决于数据库,但例如Postgres将其称为序列。

5

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


5
在Windows系统中,线程ID在整个系统中是唯一的。请参阅此MSDN库文章:http://msdn.microsoft.com/en-us/library/ms686746%28v=VS.85%29.aspx
CreateThread和CreateRemoteThread函数还返回一个标识符,用于在整个系统中唯一标识线程。线程可以使用GetCurrentThreadId函数获取自己的线程标识符。这些标识符从线程创建时起有效,直到线程终止。请注意,没有线程标识符会是0。

3

进程ID、线程ID和时间的组合不一定是唯一的。操作系统可能会在线程和进程终止后重新使用进程ID和线程ID。此外,用户可能会将时钟倒回,导致相同的时间发生两次。正如其他人所说,建议从数据库请求一个唯一的ID。Oracle有序列,MySQL有自增列,其他数据库也有类似的机制。


1

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

尽管在机器 A 上运行的进程中具有相同的进程 ID 和线程 ID 与在机器 B 上运行的进程相同的可能性相当小,但这些都是那些让人们在凌晨 4 点起床处理支持电话的错误类型...


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 不会在此值周围包裹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接