假设我们在Linux上运行了许多用户进程。每个进程都有许多线程在运行。
我可以通过调用getpid()
来获取进程ID,其返回值是一个整数。
我可以通过调用pthread_self()
来获取线程ID,其返回值是一个名为pthread_t
的opaque类型。
现在我需要在共享内存中存储进程ID(一个int,通常是4个字节)和线程ID(pthread_t
,需要计算出多少字节),以便以后可以使用这两个部分ID信息用于标识该特定线程并检查该线程是否仍在运行。
我发现许多在线来源pthread_t
投放unsigned int
或unsigned long
。由于我不想在转换过程中丢失任何数据,我应该如何处理pthread_t
数据,以便它是一个固定大小的数据(如上所述,我需要将线程信息存储在共享内存中)
另外,我应该如何通过进程ID和线程ID的组合来识别该特定线程?如何检查线程是否仍在运行?
答案 0 :(得分:4)
如果要将pid_t
和pthread_t
存储在任何位置,则应使用各自的类型(即“pid_t”和“pthread_t”)。因此,如果您想将它们存储在某个地方的共享内存中,请执行memcpy()
将它们放在那里。
至于通过PID和TID的组合识别特定线程,请参阅Nemo的评论。
如果您确实假设它们将存在,您可以让程序查看/proc
以查找相应的pid目录,并在/proc/<pid>/task
中查找线程。
答案 1 :(得分:3)
您可以使用pthread_join
作为检测完成的粗略方式,但我确信这不是您想要的。相反,您必须通过创建线程完成标志来自行处理。设置此标志的一种好方法是在pthread清理处理程序中。请参阅此相关post
答案 2 :(得分:2)
为什么不将它们装在struct
?
typedef struct
{
int procID;
pthread_t threadID;
} ProcThreadID;
不用担心pthread_t
的特定基础类型(毕竟我们在C中,所以一切都是POD,可以用memcpy
盲目复制。)
您可以使用sizeof
运算符轻松获取其大小:
size_t ptIDSize = sizeof(ProcThreadID);
您可以使用简单的memcpy
将其复制到任意位置。
答案 3 :(得分:0)
命令让进程中的线程ID运行
$ ps -eLf | grep 14965
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 14965 14732 14965 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14966 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14967 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14968 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14969 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14970 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14971 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14972 0 201 15:28 pts/10 00:00:00 ./a.out
这里第4列(LWP)显示了ID为14965的所有正在运行的线程