C++ 线程和进程ID是唯一的吗?

C++ 线程和进程ID是唯一的吗?,c++,windows,multithreading,C++,Windows,Multithreading,我使用的是静态库;它有一个函数,它使用当前时间并创建一个唯一的id,然后将该id插入到我的数据库中。这个数字在我的数据库表中应该是唯一的 有两个进程并行运行。有时,它们同时调用此函数,并生成相同的号码。当这种情况发生时,我会受到完整性侵犯 我正在考虑使用进程id、线程id和当前时间。这种组合独特吗 平台:Windows XP使用数据库生成它们。如何做到这一点取决于数据库,但Postgres将其称为序列,例如。如果程序同时运行,则进程/线程id将是唯一的,因为操作系统需要区分它们。但是系统确实重用

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

有两个进程并行运行。有时,它们同时调用此函数,并生成相同的号码。当这种情况发生时,我会受到完整性侵犯

我正在考虑使用进程id、线程id和当前时间。这种组合独特吗


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

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

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


虽然运行在机器A上的某个进程不太可能与运行在机器B上的某个进程具有相同的进程id和线程id,但这些始终是导致人们在凌晨4点起床处理支持呼叫的各种错误…

嗯,添加进程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);

ULONG64 id=((ULONG64)(pid&0xffff)不幸的是,进程ID、线程ID和时间的组合不能保证是唯一的。一旦它们引用的线程和进程终止,操作系统可能会重用进程ID和线程ID。此外,用户可能会将时钟设置回原位,因此同一时间发生两次。正如其他人所说,我会要求数据库提供唯一的ID。Oracle序列,MySQL有自动增量列,其他数据库有类似的机制。

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

CreateThread和CreateRemoteThread函数还返回一个标识符,该标识符在整个系统中唯一地标识线程。线程可以使用GetCurrentThreadId函数来获取自己的线程标识符。这些标识符从创建线程到终止线程都是有效的。请注意,没有线程标识符er永远是0