Linux:如何找到持有特定锁的线程?
我有一个在
Linux上运行的多线程程序,有时如果我对它运行gstack,有一个线程正在等待锁定很长时间(比如2-3分钟),
我检查了其余的线程,没有人拿这个锁,但是,一段时间后这个线程(LWP 19853)可以成功获得这个锁. 应该存在一个已经获得此锁的线程,但我找不到它,有什么我想念的吗? 编辑:
有一个成员“__owner”,它是现在持有互斥锁的线程的id. 解决方法
2-3分钟听起来很多,但如果您的系统负载很重,则无法保证您的线程在另一个解锁互斥锁后立即唤醒.因此,在您正在查看它的那一刻,可能只有没有线程(不再)持有锁.
Linux互斥分为两个阶段.大致: >在第一阶段,对int值进行原子CAS操作以查看是否存在 然后,解锁操作包括将值更改回初始值(通常为0)并执行futex_wake系统调用.然后内核查看是否有人在同一地址上注册了futex_wait调用,并恢复调度队列中的那些线程.真正被唤醒的线程以及何时取决于不同的事物,特别是启用的调度策略.无法保证线程按照放置锁定的顺序获取锁定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |