如何从 FreeBSD/Mac OS X 中的 Mutex 对象获取拥有的线程 ID
Posted
技术标签:
【中文标题】如何从 FreeBSD/Mac OS X 中的 Mutex 对象获取拥有的线程 ID【英文标题】:How to Get Owning Thread ID from Mutex Object in FreeBSD/Mac OS X 【发布时间】:2014-07-16 00:44:32 【问题描述】:我正在尝试获取在 Mac OS X 中调用互斥对象锁定的线程 ID。但 Mac OS X 中的互斥对象似乎没有互斥对象的所有者线程 ID。
Linux中pthread_mutex_t的定义:
typedef union
struct __pthread_mutex_s
int __lock;
unsigned int __count;
int __owner;
...
pthread_mutex_t;
pthread_mutex_t 在 Mac OS X/FreeBSD 中的定义:
struct _opaque_pthread_mutex_t
long __sig;
char __opaque[__PTHREAD_MUTEX_SIZE__];
;
如您所见,似乎没有任何信息,我可以利用这些信息来获取互斥锁的拥有线程 ID,或者我错过了什么..?
在 Mac OS X 中,我如何获得 Mutex 的所有者 ..?我一直在浏览 Mac OS X 中的 pthread 头文件,但没有任何用处。请对此有所了解。
我知道有一个类似的问题:How can I debug mutex issues on Mac OS X?
但它既没有回答,我也不想使用 lldb。我希望在我的代码中使用互斥锁的所有者来避免递归锁。
【问题讨论】:
您可以使用pthread_mutexattr_settype PTHREAD_MUTEX_RECURSIVE
允许递归锁定。没有这个,它是非递归的。也检查一下,PTHREAD_MUTEX_ERRORCHECK
。
【参考方案1】:
PThread-API 不允许检索持有特定互斥锁的线程。
出于调试目的,在代码中添加大量日志记录,告诉您哪个线程在哪个互斥锁上调用了pthread_mutex_lock()
/pthread_mutex_unlock()
。
【讨论】:
您的意思是仅在 OS X 中对..?它在 Linux 中这样做。 它在 Linux 中使用哪个 API 函数? @ManikandarajS 互斥对象本身会给你所有者线程ID,“int __owner;”来自 pthread_mutex_t 结构。 查看此链接:opensource.apple.com/source/Libc/Libc-167/pthreads.subproj/… 并在链接中搜索“所有者”一词。但这不再是 OS X 中的 pthread 定义了。很多事情都发生了变化,我正试图找出某种方法来获得互斥对象的所有者,就像以前一样。 访问数据有什么问题,如果可以访问的话..?我已经访问了这些信息并避免了来自 Linux 中同一线程的递归锁。我只是在 Linux 中寻找类似的功能。以上是关于如何从 FreeBSD/Mac OS X 中的 Mutex 对象获取拥有的线程 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mac OS X 10.5 中处理从 Finder 中的多个文件拖放?
如何在 Mac OS X 上获取拖放到应用程序二进制文件中的文件列表? [关闭]