この節では、スレッドアナライザを使用して、食事する哲学者のプログラムでのデッドロックを調べる方法について説明します。
次のリストには、実デッドロックになった食事する哲学者のプログラムの実行が示されています。
% cc -g -o din_philo din_philo.c % collect -r deadlock -o din_philo.1.er din_philo Creating experiment database din_philo.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 2: got right chopstick 2 Philosopher 3: got right chopstick 3 (hang) Execution terminated by pressing CTRL-C |
次のコマンドを入力して、er_print ユーティリティで実験結果を検証します。
% er_print din_philo.1.er (er_print) deadlocks |
Deadlock #1, Potential deadlock Thread #2 Lock being held: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #3 Lock being held: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #4 Lock being held: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #5 Lock being held: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #6 Lock being held: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Deadlock #2, Actual deadlock Thread #2 Lock being held: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #3 Lock being held: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #4 Lock being held: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #5 Lock being held: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #6 Lock being held: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Deadlocks List Summary: Experiment: din_philo.1.er Total Deadlocks: 2 (er_print)
次のスクリーンショットは、スレッドアナライザで表示されたデッドロック情報を示します。
スレッドアナライザは、din_philo.c の 2 つのデッドロックを報告します (1 つは潜在的デッドロック、もう 1 つは実デッドロック)。より詳しく調べると、2 つのデッドロックは同一であるとわかります。
デッドロックに関する巡回チェーンは次のとおりです。
スレッド 2: アドレス |
スレッド 3: アドレス |
スレッド 4: アドレス |
スレッド 5: アドレス |
スレッド 6: アドレス |
チェーン内の最初のスレッド (スレッド #2) を選択し、続いて「デュアルソース (Dual Source)」タブをクリックすると、スレッド #2 がアドレス 0x215a0
でロックを保持していたソースコード内の位置と、アドレス 0x215b8
でロックを要求したソースコード内の位置が表示されます。次のスクリーンショットには、スレッド #2 の「デュアルソース (Dual Source)」タブが示されています。デフォルトのメトリック (排他的デッドロックメトリック) が各ソース行の左側に表示されます。このメトリックは、デッドロックに関与したロック保持またはロック要求オペレーションが、その行で報告された回数を示します。
十分に大きな休眠引数を指定した場合、食事する哲学者プログラムは、実デッドロックを回避でき、通常どおりに終了します。ただし、通常どおりに終了したからといって、プログラムにデッドロックがないことを意味するわけではありません。単に、保持されたロックと要求されたロックが、所与の実行中にデッドロックチェーンを形成しなかったことを意味するだけです。他の実行でタイミングが変更すれば、実デッドロックが生じる可能性があります。次のリストは、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: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #3 Lock being held: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #4 Lock being held: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #5 Lock being held: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #6 Lock being held: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Deadlocks List Summary: Experiment: din_philo_pt.1.er Total Deadlocks: 1 (er_print) |
Deadlock #1, Potential deadlock Thread #2 Lock being held: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #3 Lock being held: 0x215b8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #4 Lock being held: 0x215d0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #5 Lock being held: 0x215e8, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Thread #6 Lock being held: 0x21600, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Lock being requested: 0x215a0, at: grab_chopstick + 0x0000002C, line 106 in "din_philo.c" Deadlocks List Summary: Experiment: din_philo_pt.1.er Total Deadlocks: 1 (er_print)
次のスクリーンショットには、スレッドアナライザインタフェースでの潜在的デッドロック情報が示されています。