演習 1.3: スレッドのボトルネックの識別
始める前に、『演習 1.2 スレッド・データの収集』を完了する必要があります。
スレッド・ビューを使用したスレッドのボトルネックの検出
スレッド・ビューはアプリケーションのすべてのスレッドの状況を表示し、スレッドのデッドロックおよび競合を明示します。
ボトルネックを検出するには以下を行います。
- プロファイル・モニターでプロファイル・リソースを右マウス・ボタン・クリックし、「アプリケーションから開く」>「スレッド・ビュー」を選択します。スレッド・ビューが開きます。ビューは以下のようなものです。
スレッドの間にある垂直方向の矢印に注目してください。矢印は、1 つのスレッド (矢印の開始点にあるスレッド) が、別のスレッド (矢印が指し示すスレッド) のロックのリリースを待機していることを示します。
- 矢印は相互に近すぎて、簡単に識別できません。これらがよく見えるようにするには、「圧縮タイム・スケールに切り替えます」ボタン
をクリックして、デフォルトのリニア・タイム・スケールから圧縮タイム・スケールに切り替えます。圧縮タイム・スケールは、重大なスレッド・アクションが発生しない時間セグメントを圧縮したものです。変更された表示は以下のようになります。
- スレッド・ビューは以下のように解釈します。
- プログラムの開始直後に、philo* スレッドが 4 つ作成されることに注意します。これらはすべて実行され、スリープされた後、再度短い間実行されます。プログラムが終了すると、これらはすべて Waiting for Lock 状態に変化します。
注: 「スリープ」状態は、一部のシステムでは明示的に表示できません。
- philo* スレッドは他の philo* スレッドからのロックを待機していますが、他のスレッドもまたロックを待機しています。この場合がデッドロックで、プログラムは行き止まりに到達していて続行できません。
注: ロックを待機しているスレッド・セグメントの上にカーソルを停止すると、ロック要求に関する詳細な情報を表示できます。ロックの名前およびロックを保持しているスレッド (「ロック中のスレッド」) を示すツールの説明が表示されます。
- スレッド・セグメントの詳細な情報は、「プロパティー」ビューで参照できます。ビューを表示するには、「ウィンドウ」>「ビューの表示」>「プロパティー」を選択します。プロパティーを表示するスレッド・セグメントを選択します。
これで、このデッドロックの原因が分かりました。『演習 1.4: スレッドのボトルネックの解決』に進んでください。