c-Linux线程id回收策略



Linux线程ID的回收策略是什么?

Linux进程ID不会立即被重用,除非新的PID达到最大限制并被倒带。

当我使用pthread_self()获取线程id时,我得到了1028、1034这样的TID。我猜这是进程中线程的内部"序列号"。因此,我认为使用线程id回收策略(如PID回收策略)会更合适。但我不太确定Linux pthread实现是否属实。

线程化linux进程具有

  1. 进程中所有线程共享的操作系统pid-使用getpid
  2. 进程中的每个线程都有自己的操作系统线程id-使用gettid
  3. pthread内部使用的pthread线程id,用于在进行各种与pthread相关的调用时识别线程-使用pthread_self

不能从你的问题中确定你是否试图实施"回收策略",或者你为什么认为你需要这样做。

编辑

作为一个无聊的好奇心,你可以浏览linux pthread代码,但从技术上讲,你没有理由在意。POSIX规范基本上只是说线程id保证在进程中是唯一的,并且在线程失效后可以自由重用。

尽管实现可能具有在系统中唯一的线程ID,但应用程序应仅假设线程ID在单个进程中可用且唯一。调用IEEE Std 1003.1-2001本卷中定义的任何函数,并将来自另一个进程的线程的线程ID作为参数传递的效果是未指定的。如果一致性实现是在detachstate属性设置为PTHREAD_CREATE_DETACHED的情况下创建的,或者已经为该线程调用了PTHREAD_detach()或PTHREAD_join(),则在线程终止后,一致性实现可以自由地重用线程ID。

在linux中,线程被实现为进程(使用共享内存和其他东西)所以内核线程id(通过gettid()获得的)实际上是进程id。

进程的第一个线程的id和该进程的id是相同的,这也表明了这一点。

现在我不知道linux内核使用的pid分配算法是什么,但我相信它会努力避免快速的pid重用(我想我在哪里读过,但记不清了)。

请注意,这些是内核线程id(由syscall gettid()返回),与"pthread_t"(由库函数pthread_self()返回的)不同。虽然两者都可以用于唯一标识线程,但前者是特定于linux的,因此如果您的代码需要可移植,您最好避免使用它(或使用#ifdef-s)。

相关内容

最新更新