スレッド化エラーの検出
次はParallel Inspectorのスレッド化エラー解析機能を試してみます。
[ツール]-[メニュー]-[Parallel Inspector]-[Inspector Threading Errors]をクリックしてください。表示されるダイアログで、最後までつまみを下げてから[Run Analyze]ボタンをクリックします。
クリック後、解析処理が始まりますのでしばらくお待ちください。解析が終了したらスレッド化エラーのイベントログが表示されるので[Interpret Result]をクリックします。スレッド化エラーもメモリエラー解析結果と同じく詳細な情報が表示されます。
今回はOverview画面のProblem列に注目してください。このサンプルプログラムの問題点がData raceだと的確に指摘しています。
さらに問題のコードが読み込みと書き込みに分けて表示され、大変分かりやすくなっています。
これで、このサンプルプログラムが毎回違う結果を出す原因は、変数stockCount(在庫数)を2つのスレッドで読み書きしていることだと分かります。並列プログラミングでは同時に2つ以上のスレッドが1つのデータを操作すると結果が予測できません。それをParallel Inspectorは検出したのです。
これさえ分かれば問題を解決したのも同然です。この短いサンプルプログラムでは効果が分かりにくいかもしれませんが、実務では数十万行以上のC/C++コードでデバッグすることが十分にありえます。そんな大量のコードの中から問題部分を探すのは大変骨が折れる作業です。それを自動かつ正確に検出できるのですから大変便利なツールです。
まとめ
今回の記事では並列プログラミング時のデバッグ作業が大変であり、その作業を助けるツールが必須であることを解説しました。また、よいツールとしてParallel Inspectorがあることを示し、簡単なサンプルコードを解析して大変便利なツールであることを確認しました。
今回は駆け足で解説しましたので、まだまだParallel Inspectorの機能を紹介しきれていません。読者の方はぜひ実際に体験版を入手してお試しください。