Sun Studio 12:线程分析器用户指南

3.4.1 检查出现死锁的运行

以下列表显示了导致实际死锁的哲人进餐程序的一个运行。

prompt% cc din_philo.c -mt -g             

prompt% collect -r deadlock a.out
Creating experiment database tha.1.er ...
Philosopher 1 is done thinking and now ready to eat.
Philosopher 2 is done thinking and now ready to eat.
Philosopher 3 is done thinking and now ready to eat.
Philosopher 0 is done thinking and now ready to eat.
Philosopher 1: got right  chopstick 1
Philosopher 3: got right  chopstick 3
Philosopher 0: got right  chopstick 0
Philosopher 1: got left chopstick 2
Philosopher 3: got left chopstick 4
Philosopher 4 is done thinking and now ready to eat.
Philosopher 1: eating.
Philosopher 3: eating.
Philosopher 3: got right  chopstick 3
Philosopher 4: got right  chopstick 4
Philosopher 2: got right  chopstick 2
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 1: got right  chopstick 1
Philosopher 4: got left chopstick 0
Philosopher 4: eating.
Philosopher 0: got right  chopstick 0
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
Philosopher 4: got right  chopstick 4
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
Philosopher 3: got right  chopstick 3
Philosopher 1: got left chopstick 2
Philosopher 1: eating.
Philosopher 2: got right  chopstick 2
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 1: got right  chopstick 1
Philosopher 4: got left chopstick 0
Philosopher 4: eating.
Philosopher 0: got right  chopstick 0
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
Philosopher 4: got right  chopstick 4
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
Philosopher 3: got right  chopstick 3
Philosopher 1: got left chopstick 2
Philosopher 1: eating.
Philosopher 2: got right  chopstick 2
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 1: got right  chopstick 1
Philosopher 4: got left chopstick 0
Philosopher 4: eating.
Philosopher 0: got right  chopstick 0
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
Philosopher 4: got right  chopstick 4
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
Philosopher 2: got right  chopstick 2
Philosopher 3: got right  chopstick 3
(hang)

Execution terminated by pressing CTRL-C


% er_print tha.1.er 
(er_print) deadlocks

Deadlock #1, Potential deadlock
	Thread #2
		Lock being held:	0x215a8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215c0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #3
		Lock being held:	0x215c0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215d8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #4
		Lock being held:	0x215d8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215f0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #5
		Lock being held:	0x215f0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x21608, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #6
		Lock being held:	0x21608, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215a8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"

Deadlock #2, Actual deadlock
	Thread #2
		Lock being held:	0x215a8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215c0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #3
		Lock being held:	0x215c0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215d8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #4
		Lock being held:	0x215d8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215f0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #5
		Lock being held:	0x215f0, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x21608, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
	Thread #6
		Lock being held:	0x21608, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"
		Lock being requested:	0x215a8, at: grab_chopstick + 0x0000002C, line 101 in "din_philo.c"

Deadlocks List Summary: Experiment: tha.1.er Total Deadlocks: 2
(er_print) 

下面的屏幕抓图给出了线程分析器中显示的死锁信息:

显示实际死锁的线程分析器窗口屏幕抓图。

线程分析器报告了 din_philo.c 的两个死锁,一个潜在死锁和一个实际死锁。通过进一步地检查,我们发现这两个死锁是相同的。死锁中涉及的循环链如下:

线程 2: 

在地址 0x215a8 占用锁,在地址 0x215c0 请求锁

线程 3: 

在地址 0x215c0 占用锁,在地址 0x215d8 请求锁

线程 4: 

在地址 0x215d8 占用锁,在地址 0x215f0 请求锁

线程 5: 

在地址 0x215f0 占用锁,在地址 0x21608 请求锁

线程 6: 

在地址 0x21608 占用锁 ,在地址 0x215a8 请求锁

选择链中的第一个线程(线程 #2),然后单击“双重数据源”选项卡,查看在源代码中的何处,线程 #2 占用锁(在地址 0x215a8),以及在何处请求锁(在地址 0x215c0)。以下屏幕抓图显示了 2 号线程的“双重数据源”选项卡。在每个源代码行的左侧显示了缺省度量(互斥死锁度量)。该度量提供(死锁中所涉及的)锁定占用或锁定请求操作在该代码行上报告的次数。

显示潜在死锁的线程分析器“双重数据源”选项卡屏幕抓图。