哪个Linux系统调用用于获取线程的ID?

时间:2013-10-13 20:58:03

标签: multithreading unix operating-system pthreads

我必须实现一个包装函数,用作pthread_self()来获取pthread ID,但我一直在搜索并且找不到哪个系统调用程序执行此操作。从Stack O中读取另一篇文章。我知道clone()用于创建线程,我也可以用ptrace()跟踪系统调用,但在手动跟踪之前...有人知道哪个系统调用了吗? / p>

4 个答案:

答案 0 :(得分:1)

系统调用0xe0,gettid()怎么样?

  

gettid()返回调用者的线程ID(TID)。在单线程进程中,线程ID等于进程ID(PID,由getpid(2)返回)。在多线程进程中,所有线程都具有相同的PID,但每个线程都具有唯一的TID。有关更多详细信息,请参阅clone(2)中对CLONE_THREAD的讨论。

答案 1 :(得分:1)

在glibc中,pthread_self()不进行系统调用,但返回指向位于TSD段中的struct pthread的指针。

答案 2 :(得分:1)

Linux进程线程有3种不同的ID:pid,pthread id和tid。

'pid'是全局的,等同于父进程id,可以通过'getpid()'轻松获得。此值是唯一的,但仅限于分配了给定ID的活动进程的持续时间。在流程终止并生成新流程后,可以为新流程“回收”此值。在进程内的所有线程中,此值都相同。这个值是你在top,htop,'ps -ef'和pidstat中看到的。

pthread_create()和phtread_self()报告'pthread id'。这个值仅在进程内是唯一的,并且仅在赋值线程的持续时间内。当线程被终止并产生时,该值可以被“回收”。该值在整个系统中不是唯一的,也不是在已终止和启动的线程之间。该值在程序外部不可见。此值不透明,可能是指针或结构,具体取决于平台。

gettid()报告'tid'线程ID。这是在Linux 2.4中引入的,并且似乎在其他平台上不可用。此值在流程内和整个系统中是唯一的。此值由top和htop以及'pidstat -t'报告。我不是100%肯定,但怀疑这个价值可以“循环”,因为流程终止并产生。当显示线程时,这是Linux工具'top','htop','pidstat -t'和'ps -efL'中出现的值。

gettid的文档:linux.die.net/gettid

您可以通过以下方式获取'gettid()':

#include <sys/types.h>
#include <sys/syscall.h>
#include <pthread.h>

我的CentOS 6.5没有正确设置并缺少gettid原型,尽管文档说它应该通过上面的#includes存在。这是一个模仿'gettid'的宏:

#ifndef gettid
// equivalent to:  pid_t  gettid(void)
#define gettid() syscall(SYS_gettid)
#endif

请注意,由于这是一个系统调用(),您可以通过缓存结果并避免重复使用系统调用()来获得效率。

答案 3 :(得分:0)

这可能会有所帮助。

UINT32 tid = syscall(SYS_gettid);