5

fork并将pthread_create返回一个进程 ID 或线程 ID。

但是我不知道这些id的取值范围。

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

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

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

4

4 回答 4

8

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

于 2013-05-17T00:20:20.170 回答
3

pid的最大值是可变的,默认为32768,也就是short int最大值的大小。并且可以兼容早期版本的UNIX。

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

顺便说一句,</p>

进程 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 数据类型表示为无符号整数。FreeBSD 5.2.1 和 Mac OS X 10.3 使用指向 pthread_t 数据类型的 pthread 结构的指针。--APUE

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

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

于 2013-05-17T01:12:07.140 回答
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应该做的那样。

于 2013-05-17T11:16:11.267 回答
0

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

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

在检查 pthread_create 结果时,您可能分配了自己定义的错误值。

例如: pthread_create 失败 - 将 say -ve 值分配给 tid 。因此,在查找时,您可以验证检查您自己的 #define -ve 值。

于 2013-05-17T12:07:20.803 回答