fork
和pthread_create
将返回进程ID或线程ID。
但我不知道这些ID的值范围。
现在我想创建一个查找表,在每个条目中都有一个项目/字段用于线程ID。 每个条目的结构如下:
typedef struct {
int seq;
pthread_t tid;
...
} entry_t;
当我没有得到一个线程的tid时,我想为一个条目的无效tid
分配一个值(很快这个字段将填充一个有效的,但在此之前{{1函数将检查pid是否有效)。那么,线程和进程id的值范围是什么?
答案 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值。