我正在逐步浏览可执行文件所链接到的第三方库中的某些代码,特别是“关机”代码。我正在将SIGQUIT发送到我们的应用程序,该应用程序关闭了第三方对象。

由于某种原因,可靠地,该库对pthread_mutex_destroy的调用失败,并返回16:EBUSY。该文档说,当“实现在另一个线程锁定或引用(例如,在pthread_cond_timedwait()或pthread_cond_wait()中使用该对象时)检测到销毁互斥对象所引用的对象的尝试时,就会发生这种情况”。

我在pthread_mutex_destroy()被调用的地方放置了一个断点。

a)我不认为它已被锁定,因为互斥体的状态如下所示:
$ 6 = {__数据= {__锁= 0,__ count = 0,__ owner = 0,__ nusers = 4294967293,__ kind = 0,__ spins = 0,__ list = {__prev = 0x0,__ next = 0x0}},
__size ='\000'“\375,\377\377\377”,'\000',__align = 0}

我的猜测是__lock = 0表示“已解锁”。但是,我不知道__nusers真正代表什么。

b)我看不到pthread_cond_wait()或pthread_cond_timedwait()的任何证据。我回溯了所有正在运行的线程,并且没有人在等待这个互斥体。

这可能是怎么回事?

最佳答案

显然,您的问题出在__nusers成员上。我想,您已在某个地方解锁了已经解锁的互斥锁。

07-24 14:00