プログラムのパフォーマンス解析

ロック解析ツール

C 開発者は、ほとんどの場合、libthread ライブラリを介した Solarisのユーザーレベルスレッドに対する直接プログラミングによって、アプリケーションをスレッド化できます。Sun WorkShop アプリケーションでは、デバッガに対してマルチスレッド化された拡張機能部分を実行することで、Solarisのユーザーレベルスレッドを利用したプログラムのデバッグが可能となります。また、ロック lint を使用することにより、プログラム中で使用されているロックの整合性や、潜在的な競合状態の有無などを静的にチェックできます。

マルチスレッド化されたアプリケーションでは、スレッドは、共有しているデータに関連したロックの獲得および解放を行う必要があります。スレッドが適切なロックの獲得および解放に失敗した場合、プログラムが同じ入力に対して異なる実行結果を生む原因となります。こうした状況は 「データ競合」 として知られています。データ競合は、簡単に陥りやすい問題ですが、その発見はとても困難です。

また、さまざまなスレッドが解放されることのないロックを待ち続けると、プログラムは 「デッドロック」 状態に陥ることがあります。デッドロックの定義については、「基本概念」を参照してください。

Sun WorkShop は、ロックおよびその使われ方を解析するコマンド行ユーティリティを提供します。ロック lint は、相互排他的ロックおよび複数読み取り/単一書き込みロックの使い方に矛盾がある箇所を捜し出します。ロック lint は、変数にアクセスしている最中に、適切なロックの保持に失敗するなどの、一般的なデータ競合の原因を検出します。また、デッドロックの一般的な原因も検出します。

ロック lint が使用する情報を収集するには、C コンパイラに対して -Zll オプションを指定し、それぞれの .c ソースコードファイルごとに .ll ファイルを生成します。.ll ファイルには、各関数の制御の流れや、相互排他的ロックおよび読み取り側/書き込み側ロックにおけるオペレーションあるいは変数へのアクセスに関する情報が含まれます。

ロック lint については第 5 章「ロック解析ツール」で解説します。