次のリストは、食事する哲学者プログラムが実デッドロックになる実行を示しています。
prompt% cc din_philo.c -mt -g prompt% collect -r deadlock a.out 実験データベース 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) CTRL-C を押して実行を終了します % er_print tha.1.er (er_print) deadlocks デッドロック #1, 潜在的デッドロック スレッド #2 ロック保持中: 0x215a8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215c0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #3 ロック保持中: 0x215c0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215d8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #4 ロック保持中: 0x215d8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215f0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #5 ロック保持中: 0x215f0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x21608, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #6 ロック保持中: 0x21608, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215a8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" デッドロック #2, 実デッドロック スレッド #2 ロック保持中: 0x215a8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215c0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #3 ロック保持中: 0x215c0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215d8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #4 ロック保持中: 0x215d8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215f0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #5 ロック保持中: 0x215f0, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x21608, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" スレッド #6 ロック保持中: 0x21608, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" ロック要求中: 0x215a8, 位置: grab_chopstick + 0x0000002C, 行 101 "din_philo.c" デッドロック一覧の概要: 実験: tha.1.er 総デッドロック数: 2 (er_print)
次のスクリーンショットは、スレッドアナライザでのこのデッドロック情報を示しています。
スレッドアナライザは、din_philo.c について 2 つのデッドロック (潜在的と実デッドロック 1 つずつ) を報告しています。よく見ると、2 つのデッドロックは同一であることがわかります。このデッドロックに関係している循環チェーンは次のようなものです。
スレッド 2: |
アドレス |
スレッド 3: |
アドレス |
スレッド 4: |
アドレス |
スレッド 5: |
アドレス |
スレッド 6: |
アドレス |
チェーンの最初のスレッド (スレッド #2) を選択し、「デュアルソース」タブをクリックして、スレッド #2 のロック保持が発生したアドレス 0x215a8
に対応するソースコード位置と、ロック要求が発生したアドレス 0x215c0
に対応するソースコード位置を確認します。次のスクリーンショットは、スレッド 2 の「デュアルソース」タブを示しています。デフォルトメトリック (「排他的デッドロック」メトリック) は各ソース行の左側に表示されます。このメトリックは、その行について、1 つのデッドロックに関係するロック保持またはロック要求動作が報告された回数を示します。