在Linux上,线程由pthread_t或TID标识。 我正在寻找这两种线程ID之间的桥梁:
给一个pthread_t我可以得到它的TID ? 显然不是没有黑客pthread的内部:(但我仍然要求,以防万一有一个干净的方式来做到这一点。
给定一个TID (或PID ),我可以得到一个pthread_t句柄吗?
因为术语“线程ID”在这个上下文(以及在文档中)是不明确的,所以有一些背景:
POSIX pthread API定义了一个pthread_ttypes,查询/作用于线程的所有函数都使用pthread_t参数,我们可以通过pthread_self()来获得这样的句柄。 文档调用这些“线程ID”,但在这里我称它们为消除歧义的句柄,因为多个不同的pthread_t值可能表示相同的线程,因此需要pthread_equal(pthread_t,pthread_t) 。
另一方面,在Linux上至less有一个TID或线程标识的概念。 可以通过系统调用获得当前的TID : syscall(SYS_gettid) 。 TID有一些有趣的属性,例如对于一个线程来说是唯一的,并且可以与PID相媲美,这允许容易地识别主线程等。
dynamic链接器和dynamic加载器有什么区别?
HTML到PDF(使用谷歌浏览器API)?
设备上没有剩余空间
如何将.NET Windows服务应用程序迁移到Linux
创buildspec文件(RPM)
与HID交谈
使用netlink inet_diag进行实时套接字监控
在C中转换转义序列
Ubuntu 12.04 LTS:更新python 2.7.3到2.7.6而不破坏依赖关系
Awksearch文件的string
不幸的是,没有可移植的方式,因为没有要求pthread_t映射到tid :
实现可以选择将线程ID定义为结构。 这比使用int可以提供更多的灵活性和健壮性。 例如,一个线程ID可以包含一个序列号,允许检测“悬挂ID”(已被分离的线程ID的副本)。 由于C语言不支持比较结构类型,所以提供了pthread_equal()函数来比较线程ID。
历史上,在NPTL之前, pthread_t没有将1对1映射到tid 。
您需要使用pthreads库实现细节来查看tid 。 我不会建议这样做,因为这样的代码将不能移植。
为了好奇,只有glibc, pthread_t是一个struct pthread * :
27 int 28 __pthread_kill (pthread_t threadid,int signo) 29 { 30 struct pthread *pd = (struct pthread *) threadid; ... 40 pid_t tid = atomic_forced_read (pd->tid);
pthread是 :
122 /* Thread descriptor data structure. */ 123 struct pthread 124 { ... 166 /* Thread ID - which is also a 'is this thread descriptor (and 167 therefore stack) used' flag. */ 168 pid_t tid;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。