スレッド競合検出
Note
SOLID 3.0.0 以降で使用できます。
本機能を使用するには、スレッドサニタイザに対応したSOLID-OSが必要です。使用される方はお問い合わせください。
概要
Clangコンパイラが提供するスレッドサニタイザの機能を利用して、複数スレッド間で発生するデータアクセス競合を検出します。
スレッドサニタイザは、実行時にスレッド(タスク)間でのデータアクセスの競合を検出する機能です。 同期しない複数のスレッドが同じメモリをアクセスする場合に、少なくとも一つのスレッドが書込みをしている場合の競合を検出し、 デバッガが競合箇所を特定して通知します。
使い方
ソリューションのプロパティ(通常、ソリューションファイル
.ptsln
と同一フォルダにある.props
) に以下のエントリがあることを確認 (無ければ追加)。<PropertyGroup Label="UserMacros"> ... <LibTcsan>true</LibTcsan> ... </PropertyGroup>
プロジェクトのプロパティページから はい に設定します。
を再ビルドし、データアクセス競合が発生するプログラムを実行します。
データアクセス競合が発生すると、自動的にブレークした後、発生した場所がソースコード上で表示され、詳細な内容がデバッグ例外ウインドウに出力されます。
競合発生時の通知について
ソースコード上には、競合が発生した箇所が表示されます。 データ競合を検出 をクリックすると、競合が発生した、もう片方のソースコード位置を表示します。
デバッグ例外ウィンドウに、競合の詳細な情報が表示されます。
Access address
データ競合が検出されたアクセス先のアドレス
Task ID
問題が発生したタスクID
Access size
アクセス幅 (バイト)
Access type
アクセス種別 (ReadまたはWrite)
PC
データ競合が発生した時のプログラムカウンタの値
注意
スレッドサニタイザは全ての競合検出を担保するものではありません。変数競合検出による極端なパフォーマンス低下を防ぐため、 一定の確率での検出となりますが、検出できた競合についてはその競合が確定となります。 そのため、1度のプログラム実行につき、数回しか起こらないようなデータ競合を検出する事は困難です。