【问题标题】:How to Get Owning Thread ID from Mutex Object in FreeBSD/Mac OS X如何从 FreeBSD/Mac OS X 中的 Mutex 对象获取拥有的线程 ID
【发布时间】: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

标签: c multithreading macos pthreads mutex


【解决方案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 中寻找类似的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多