我正在使用一个静态库;它有一个函数,它使用当前时间并创建一个唯一的ID,然后将其插入到我的数据库中。这个数字在我的数据库表中应该是唯一的。线程和进程ID是唯一的吗?
有两个并行运行的过程。有时他们同时调用该函数,并生成相同的编号。发生这种情况时我会得到一个完整性违规。
我想使用的进程ID,线程ID,以及当前时间。这种组合是独特的吗?
平台:Windows XP
我正在使用一个静态库;它有一个函数,它使用当前时间并创建一个唯一的ID,然后将其插入到我的数据库中。这个数字在我的数据库表中应该是唯一的。线程和进程ID是唯一的吗?
有两个并行运行的过程。有时他们同时调用该函数,并生成相同的编号。发生这种情况时我会得到一个完整性违规。
我想使用的进程ID,线程ID,以及当前时间。这种组合是独特的吗?
平台:Windows XP
使用数据库生成它们。如何做到这一点取决于数据库,但以Postgres calls them sequences为例。如果作为操作系统需要区分它们的程序同时运行
进程/线程ID是唯一的。但系统确实重用了ID。 因此,对于你的情况,是的,它是一个好主意,将进程ID或线程ID添加到你的标记,我不认为你会同时需要。
虽然进程ID和线程ID将是唯一的它会更好地使用数据库来为您生成的唯一ID(如R.佩特建议)如果仅仅因为你可能限制你的可扩展性,除非你还包括一个独特的机器ID以及...
虽然这可能是不太可能的,你的机器上运行的进程之一将有相同的进程ID和线程ID作为您的机器上运行的进程之一B这些总是种类这最终让人们摆脱在凌晨4点来处理支持电话床虫子...的
好,加上进程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将不会在时间戳跳转之前环绕在此值中)。
进程ID的组合,线程ID和时间不幸不能保证是唯一的。一旦所涉及的线程和进程终止,操作系统可以重用进程ID和线程ID。另外,用户可以设置时钟,所以同一时间出现两次。正如其他人所说,我会问数据库一个唯一的ID。 Oracle具有序列,MySQL具有自动递增列,其他数据库具有类似的机制。
在Windows上,线程ID在整个系统中是唯一的。看到这个MSDN库文章:
http://msdn.microsoft.com/en-us/library/ms686746%28v=VS.85%29.aspx
的的CreateThread和远程线程函数也返回唯一标识在整个系统中的线程的标识符。线程可以使用GetCurrentThreadId函数来获取自己的线程标识符。标识符从创建线程开始直到线程终止时有效。请注意,没有线程标识符将是0.
+1尼斯解释:) – Darren 2012-11-29 14:23:10