如何从 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 上获取拖放到应用程序二进制文件中的文件列表? [关闭]

Mac OS X 可可应用程序中的 Internet 连接通知

如何在 OS X 10.7.3 中复制目录?

如何在 Mac OS X 上构建 DTrace?

如何从 Mac OS X 中卸载 MySQL?