我必须实现一个pthread_self()
用于获取 pthread ID 的包装函数,但我一直在搜索并且没有找到执行此操作的系统调用。从 Stack O 阅读另一篇文章。我知道clone()
用于创建线程,我也可以使用它来跟踪系统调用,ptrace()
但在手动跟踪它之前......有人知道哪个系统调用是吗?
4 回答
linux 进程线程有 3 个不同的 ID:pid、pthread id 和 tid。
'pid' 是全局的,等同于父进程 id,可以通过 'getpid()' 轻松获取。此值是唯一的,但仅在分配给定 ID 的活动进程的持续时间内。在进程终止并产生新进程后,该值可能会为新进程“回收”。这个值在一个进程内的所有线程中都是相同的。该值是您将在 top、htop、'ps -ef' 和 pidstat 中看到的值。
'pthread id' 由 pthread_create() 和 phtread_self() 报告。这是值仅在进程内是唯一的,并且仅在分配线程的持续时间内是唯一的。当线程终止并产生时,该值可能会被“回收”。该值在整个系统中不是唯一的,在已终止和启动的线程中也不是唯一的。这个值在程序之外是不可见的。此值是不透明的,并且可能是指针或结构,具体取决于平台。
'tid' 线程 id 由 gettid() 报告。这是在 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
请注意,由于这是一个 syscall(),因此您将通过缓存结果并避免重复使用 syscall() 来提高效率。
在 glibc 中,pthread_self()
不进行系统调用,而是返回指向struct pthread
位于 TSD 段中的 a 的指针。
系统调用 0xe0, gettid()怎么样?
gettid() 返回调用者的线程 ID (TID)。在单线程进程中,线程 ID 等于进程 ID(PID,由 getpid(2) 返回)。在多线程进程中,所有线程都有相同的 PID,但每个线程都有唯一的 TID。有关详细信息,请参阅 clone(2) 中对 CLONE_THREAD 的讨论。
这可能会有所帮助。
UINT32 tid=系统调用(SYS_gettid);