Oracle Solaris Studio 12.2: スレッドアナライザユーザーズガイド

3.6.1.1 誤検知レポート

トークンのシステムを使用するときでも、スレッドアナライザは、まったく存在していないのにこの実装の潜在的デッドロックを報告します。これが誤検知です。潜在的デッドロックについて詳しく説明した次のスクリーンショットを見てください。

図 3–5 潜在的デッドロックの誤検知レポート

スレッド #2 でのデッドロックを示した「スレッドアナライザ (Thread Analyzer)」ウィンドウのスクリーンショット。

チェーンの最初のスレッド (スレッド #2) を選択し、「デュアルソース (Dual Source)」タブをクリックして、スレッド #2 がアドレス 0x216a8 でロックを保持していたソースコード位置と、アドレス 0x216c0 でロックを要求したソースコードでの位置を確認します。次の図には、スレッド #2 の「デュアルソース (Dual Source)」タブが示されています。

図 3–6 誤検知の潜在的デッドロックのソース

潜在的デッドロックを示すスレッドアナライザの「デュアルソース (Dual Source)」タブのスクリーンショット。

din_philo_fix1.cget_token() 関数は、while ループを使用してスレッドを同期します。スレッドは、トークンの取得に成功するまで、while ループ外に出ません (これは、num_can_eat が 0 より大きいときに起こります)。while ループは同時に食事する人を 4 人に制限します。ただし、while ループによって実装された同期は、スレッドアナライザには認識されません。スレッドアナライザは、5 人の哲学者全員が同時に箸を掴んで食事しようとしていると想定しているので、潜在的デッドロックを報告します。次の節では、スレッドアナライザが認識する同期を使用することによって、同時に食事する人の人数を制限する方法について詳しく説明します。