Oracle® Solaris Studio 12.4:线程分析器用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

检查存在潜在死锁但仍可完成的运行

如果提供足够大的休眠参数,哲学家就餐程序就可避免实际死锁并正常终止。但是,正常终止并不意味着程序可以完全避免死锁。它仅仅表示在给定的一次运行中,持有和请求的锁未形成死锁链。如果在其他运行中出现了时间变化,则仍可能会发生实际死锁。下面列出了由于引入 40 秒休眠时间而正常终止的哲学家就餐程序的一次运行。但是,er_print 实用程序和线程分析器会报告潜在死锁。

% cc -g -o din_philo_pt din_philo.c
% collect -r deadlock -o din_philo_pt.1.er din_philo_pt 40
Creating experiment database tha.2.er ...
Philosopher 0 is done thinking and now ready to eat.
Philosopher 2 is done thinking and now ready to eat.
Philosopher 1 is done thinking and now ready to eat.
Philosopher 3 is done thinking and now ready to eat.
Philosopher 2: got right  chopstick 2
Philosopher 3: got right  chopstick 3
Philosopher 0: got right  chopstick 0
Philosopher 4 is done thinking and now ready to eat.
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 0: got right  chopstick 0
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
...
Philosopher 4: got right  chopstick 4
Philosopher 3: got right  chopstick 3
Philosopher 2: got right  chopstick 2
Philosopher 4: got left chopstick 0
Philosopher 4: eating.
Philosopher 4 is done eating.
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
Philosopher 0: got right  chopstick 0
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 3 is done eating.
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
Philosopher 0 is done eating.
Philosopher 2 is done eating.
Philosopher 1: got right  chopstick 1
Philosopher 1: got left chopstick 2
Philosopher 1: eating.
Philosopher 1 is done eating.
%

Execution terminated normally

键入提示符下显示的以下命令以使用 er_print 实用程序检查实验:

% er_print din_philo_pt.1.er
(er_print) deadlocks
Deadlock #1, Potential deadlock
        Thread #2
                Lock being held:        0x21388, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213a0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #3
                Lock being held:        0x213a0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213b8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #4
                Lock being held:        0x213b8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213d0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #5
                Lock being held:        0x213d0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213e8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #6
                Lock being held:        0x213e8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x21388, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"

Deadlocks List Summary: Experiment: din_philo_pt.1.er Total Deadlocks: 1

以下屏幕抓图显示了线程分析器中的潜在死锁信息。

图 3-4  din_philo.c 中的潜在死锁

image:线程分析器窗口的屏幕抓图,显示了潜在的死锁。