pthread_mutex_destroy:为什么它会返回EBUSY?

时间:2014-05-20 02:44:43

标签: c++ linux multithreading posix

我正在执行我们的可执行文件链接到的第三方库中的一些代码,特别是“关闭”代码。我正在向我们的应用程序发送一个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()的证据。我得到了所有线程运行的回溯,没有人在等待这个互斥锁。

这可能会发生什么?

1 个答案:

答案 0 :(得分:4)

显然,您的问题在于__nusers成员。我猜想,你在某处解锁了已经解锁的互斥锁。