gdb 查看死锁

死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每一个线程都在等待被  算法

其余线程占用并堵塞了的资源。例如,若是线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。app

gdb调试死锁的方法:spa

gdb 线程

attach pid调试

thread apply all bt资源

找到_lll_lock_wait 锁等待的地方。it

而后查找该锁被哪一个线程锁住了。thread

例如:程序

查看哪一个线程拥有互斥体方法

(gdb) print AccountA_mutex

$1 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2527,

__m_kind = 0, __m_lock

= {__status = 1, __spinlock = 0}}

(gdb) print 0x2527

$2 = 9511

(gdb) print AccountB_mutex

$3 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2529,

__m_kind = 0, __m_lock = {__status = 1, __spinlock = 0}}

(gdb) print 0x2529

$4 = 9513

(gdb)

从上面的命令中,咱们能够看出AccontA_mutex是被线程 5(LWP 9511)加锁(拥有)的,而AccontB_mutex是被线程 3(LWP 9513)加锁(拥有)的。

找出死锁的地方,对应检查代码就能够了。死锁大可能是对锁的使用发生交叉所致的,解决死锁的方法常有:

有序资源分配法

银行算法

相关文章
相关标签/搜索