我有一个核心转储文件,其中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
变成本质上的“消极”?