线程和进程id的值范围是多少?

时间:2013-05-17 00:12:44

标签: c linux multithreading multiprocessing

forkpthread_create将返回进程ID或线程ID。

但我不知道这些ID的值范围。

现在我想创建一个查找表,在每个条目中都有一个项目/字段用于线程ID。 每个条目的结构如下:

 typedef struct {
   int seq;
   pthread_t tid;
   ...
 } entry_t;

当我没有得到一个线程的tid时,我想为一个条目的无效tid分配一个值(很快这个字段将填充一个有效的,但在此之前{{1函数将检查pid是否有效)。那么,线程和进程id的值范围是什么?

4 个答案:

答案 0 :(得分:8)

pthread_t类型完全不透明。您只能将它与pthread_equal函数进行相等性比较,并且没有与任何有效线程ID不同的保留值,但这样的值可能会添加到下一版本的POSIX标准中。因此,您需要在线程ID旁边存储第二个字段以跟踪它是否有效。

答案 1 :(得分:3)

pid的最大值是可更改的,默认情况下是32768,这是short int的最大值的大小。并且它可以与早期版本的UNIX兼容。

您可以在/ proc / sys / kernel / pid_max中查看和更改它。

顺便说一句,

  

进程ID 0通常是调度程序进程,通常称为   交换者。磁盘上的程序对应于此进程,即   内核的一部分,被称为系统进程。进程ID 1是   通常是init进程,并由内核在结束时调用   引导程序。此过程的程序文件是   旧版UNIX系统中的/ etc / init,并且是/ sbin / init   较新的版本。这个过程负责启动UNIX   内核被引导后的系统。                       --APUE

tid仅在其所属的过程的上下文中具有重要性。 在不同的UNIX系列中,pthread_t的类型不同,例如

  

Linux 2.4.22对pthread_t数据使用无符号长整数   类型。 Solaris 9将pthread_t数据类型表示为unsigned   整数。 FreeBSD 5.2.1和Mac OS X 10.3使用指向pthread的指针   pthread_t数据类型的结构。 --APUE

所以你不能简单地告诉它的范围。

但threads_max最多显示进程中有多少个线程,您可以在/ proc / sys / kernel / threads-max中查看和更改它。

答案 2 :(得分:2)

正如其他人所指出的,没有定义的值表示无效的pthread-id。

解决这个问题的一种方法可能是修改描述类似线程的结构:

typedef struct {
  int seq;
  pthread_t pthread;
  int pthread_is_valid; /* set this to 0 on initialisation of the structure 
                          and change it be 1 if pthread_create() was successfull. */
  ...
} entry_t;

另外,我建议不要调用pthread_create()的第一个参数tid设置的值,因为这会导致gettid()重新调整的名称模糊不清,这在Linux下实际上是一个进程ID。


由于无效的流程ID -1应该这样做。

答案 3 :(得分:0)

我的意见是,为什么不能通过为tid本身分配定义的错误值来跟踪无效的线程ID。在制作查找表时,如果在表增长时继续向struct添加更多成员,则大小可能会受到限制。

/ *线程标识符* / typedef unsigned long int pthread_t;

在检查pthread_create结果时,可能会指定自己定义的错误值。

例: pthread_create失败 - 为tid分配说-ve值。所以在查找时你可以验证检查你自己的#define -ve值。