我在第三方库的“关闭”代码中进行了一些代码步进,向我们的应用程序发送 SIGQUIT,这将关闭第三方对象。但是出现了问题,该库正在调用 pthread_mutex_destroy 时失败,并返回错误码 16: EBUSY。文档说当“实现检测到在其他线程中锁定或引用(例如,在 pthread_cond_timedwait() 或 pthread_cond_wait() 中使用)mutex 引用的对象被销毁的尝试时,会发生此错误”。 我已经在 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() 的证据。我得到了所有正在运行的线程的回溯,并且没有一个线程在等待该互斥量。
这里可能出了什么问题?
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() 的证据。我得到了所有正在运行的线程的回溯,并且没有一个线程在等待该互斥量。
这里可能出了什么问题?
pthread_mutex_destroy()
在__nusers
成员非零时确实返回EBUSY
。不过,你的互斥锁状态似乎无效(需要声明的是,pthread代码相当复杂,所以我可能在这方面出错的概率大于0)。有没有可能你的关闭代码的某个部分在销毁调用完成之前破坏了互斥锁或释放了互斥锁所在的内存块? - Michael Burr