【发布时间】:2014-10-19 11:04:12
【问题描述】:
线程有一个类型为pthread_mutex_t 的互斥锁,为自己锁定。另一个线程想知道持有这个锁定互斥锁的线程的线程 ID。
据我所知,有两种类型的线程 ID。 pthread_self()返回的POSIX/pthread线程id,系统调用gettid()返回的linux线程id。这两个是独立的,没有关系,AFAIK(如果我错了,请纠正我)。
结构体pthread_mutex_t,int __owner中有一个字段存储了当前持有锁的线程的线程id。这个字段可以被访问,
pthread_mutex_t mutex;
int tid;
tid = mutex.__data.__owner;
如此处所述 - Is it possible to determine the thread holding a mutex?。
__owner 字段具有 linux 系统线程 ID(将由 gettid() 返回)而不是 POSIX/pthread 线程 ID(将由 pthread_self() 返回)。
我想比较当前调度的线程是否拥有互斥锁。所以,我应该将pthread_self() 与__owner 值进行比较。
我可以使用gettid() 代替pthread_self(),但我只能使用pthread_self()。 (一些可移植性功能)。
有什么方法可以正确确定锁定的互斥锁的线程 ID,它会返回 pthread_t 而不是系统线程 ID?
我将不胜感激,谢谢!
问候,
优素福·侯赛尼。
【问题讨论】:
-
既然你在技术上是一个不透明的对象(pthread_mutex_t)里面闲逛,担心可移植性问题似乎有点晚了?我想你需要做的是构造一个
__owner值到pthread_self()的映射,每个pthread 可以在启动时将自己添加到该映射中。 (该映射需要由互斥锁保护,当 pthread “注册”自身时,可以从中提取__owner值。) -
Is it possible to determine the thread holding a mutex? 的可能重复项请问您的问题与您链接的问题有何不同?
-
@alk,我明白,我的问题有所不同,因为我想知道一种方法来获取 pthread_t 类型的线程 id,而不是系统 TID 类型。链接的问题没有对此给出任何解决方案。
-
所以您同意这两个问题是相同的。我怀疑你得到了你的问题的答案,就像另一个问题的答案一样,没有答案。对于后一种解决方法提出了建议。
-
只需编写您想要的代码。我建议使用单独的互斥锁来保护所有者变量。
标签: linux multithreading pthreads posix mutex