Linux线程ID的循环策略是什么?
除非新的PID获得最大限制并被重新启动,否则不会立即重用Linux进程ID。
当我使用pthread_self()获取线程ID时,我得到了像1028,1034这样的TID。我猜它是进程中线程的内部“序列号”。所以我想使用像PID回收策略这样的线程id回收策略会更合适。 但我不太确定Linux pthread实现是否属实。
答案 0 :(得分:1)
线程linux进程有
getpid
gettid
pthread_self
和类似的。无法从您的问题中确定您是否尝试实施“回收策略”或您认为需要这样做的原因。
修改强>
作为一个空闲的好奇心,您可以查看linux pthread代码,但从技术上讲,您没有理由关心。 POSIX规范基本上只是说线程id保证在进程中是唯一的,并且在线程死后可以自由地重用。
虽然实现可能具有系统中唯一的线程ID,但应用程序应该只假设线程ID在单个进程中可用且唯一。调用此标准IEEE Std 1003.1-2001中定义的任何函数并作为参数传递来自另一个进程的线程的线程ID的效果未指定。如果在将detachstate属性设置为PTHREAD_CREATE_DETACHED或者为该线程调用了pthread_detach()或pthread_join()的情况下创建线程终止后,符合实现可以在线程终止后重用线程ID。
答案 1 :(得分:0)
在linux中,线程被实现为进程(具有共享内存和其他内容) 因此内核线程ID(您通过gettid()获得的ID)实际上是进程ID。
一个进程的第一个线程的ID和该进程的ID是一个相同的事实也表明了这一点。
现在我不确切知道linux内核使用的pid分配算法是什么,但是我相信它为避免快速pid重用做出了一些努力(我想我已经在某个地方读过了,但是不记得了)。 / p>
请注意,这些是内核线程ID(由syscall gettid()返回),与“ pthread_t”(由库函数pthread_self()返回)不同。 尽管两者都可以用来唯一地标识线程,但是前者是特定于Linux的,因此,如果您的代码需要可移植,则最好避免使用它(或使用#ifdef-s)。