我有一个核心转储文件,其中pthread_mutex_destroy()返回了错误,可能是因为在pthread_mutex_t数据结构中该__nusers字段设置为 4294967295 (0xFFFFFFFF)。以下是完整值:
mMutex = {
__data = {
__lock = 0,
__count = 0,
__owner = 0,
__nusers = 4294967295,
__kind = 1,
__spins = 0,
__elision = 0,
__list = {
__prev = 0x0,
__next = 0x0
}
},
__size = '\000' <repeats 12 times>, "\377\377\377\377\001", '\000' <repeats 22 times>,
__align = 0
}
这是一个递归互斥锁。该代码在 RHEL 8 系统上运行。
因此,乍一看,这看起来像是__nusers以某种方式经常减少一次。但我不明白这是怎么发生的——pthread_mutex_unlock()在没有锁定的情况下调用首先将__nusers计数保留为 0(它返回EPERM,但递归互斥体不应该涉及任何未定义的行为)。
在什么情况下会__nusers变成本质上的“消极”?