2009-11-17 183 views
5

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

有两个并行运行的过程。有时他们同时调用该函数,并生成相同的编号。发生这种情况时我会得到一个完整性违规。

我想使用的进程ID,线程ID,以及当前时间。这种组合是独特的吗?

平台:Windows XP

回答

10

使用数据库生成它们。如何做到这一点取决于数据库,但以Postgres calls them sequences为例。如果作为操作系统需要区分它们的程序同时运行

5

进程/线程ID是唯一的。但系统确实重用了ID。 因此,对于你的情况,是的,它是一个好主意,将进程ID或线程ID添加到你的标记,我不认为你会同时需要。

1

虽然进程ID和线程ID将是唯一的它会更好地使用数据库来为您生成的唯一ID(如R.佩特建议)如果仅仅因为你可能限制你的可扩展性,除非你还包括一个独特的机器ID以及...

虽然这可能是不太可能的,你的机器上运行的进程之一将有相同的进程ID和线程ID作为您的机器上运行的进程之一B这些总是种类这最终让人们摆脱在凌晨4点来处理支持电话床虫子...的

0

好,加上进程ID和线程ID有可能导致对相同数量

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

不太可能但可能的。

所以近安全IDS,你需要至少像

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

64位ID字段(但是,这仍然不能保证唯一性,因为它假定线程ID不以重叠他们中和了16位值,但我认为我没有看到65536以上的PID,除非您创建数千个线程,否则线程ID将不会在时间戳跳转之前环绕在此值中)。

3

进程ID的组合,线程ID和时间不幸不能保证是唯一的。一旦所涉及的线程和进程终止,操作系统可以重用进程ID和线程ID。另外,用户可以设置时钟,所以同一时间出现两次。正如其他人所说,我会问数据库一个唯一的ID。 Oracle具有序列,MySQL具有自动递增列,其他数据库具有类似的机制。

5

在Windows上,线程ID在整个系统中是唯一的。看到这个MSDN库文章:

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

的的CreateThread和远程线程函数也返回唯一标识在整个系统中的线程的标识符。线程可以使用GetCurrentThreadId函数来获取自己的线程标识符。标识符从创建线程开始直到线程终止时有效。请注意,没有线程标识符将是0.

+0

+1尼斯解释:) – Darren 2012-11-29 14:23:10