我正在执行我们的可执行文件链接到的第三方库中的一些代码,特别是“关闭”代码。我正在向我们的应用程序发送一个SIGQUIT,它关闭了第三方对象。
由于某种原因,库正在对pthread_mutex_destroy进行的调用失败并返回16:EBUSY。文档说这种情况发生在“实现检测到在互斥锁被锁定或引用(例如,在pthread_cond_timedwait()或pthread_cond_wait())中被另一个线程使用时,企图销毁互斥锁引用的对象的尝试。” p>
我把断点放在调用pthread_mutex_destroy()的地方。
a)我不相信它被锁定,因为互斥锁的状态如下所示: $ 6 = {__ data = {__lock = 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()的证据。我得到了所有线程运行的回溯,没有人在等待这个互斥锁。
这可能会发生什么?
答案 0 :(得分:4)
显然,您的问题在于__nusers
成员。我猜想,你在某处解锁了已经解锁的互斥锁。