スレッド競合検出

Note

SOLID-3.0.0 以降で使用できます。

本機能を使用するには、スレッドサニタイザに対応したSOLID-OSが必要です。使用される方はお問い合わせください。

概要

Clangコンパイラが提供するスレッドサニタイザの機能を利用して、複数スレッド間で発生するデータアクセス競合を検出します。

スレッドサニタイザは、実行時にスレッド(タスク)間でのデータアクセスの競合を検出する機能です。 同期しない複数のスレッドが同じメモリをアクセスする場合に、少なくとも一つのスレッドが書込みをしている場合の競合を検出し、 デバッガが競合箇所を特定して通知します。


使い方

  1. ソリューションのプロパティ(通常、ソリューションファイル .ptsln と同一フォルダにある、.props)に以下のエントリがあることを確認(無ければ追加)。

    <PropertyGroup Label="UserMacros">
    ...
      <LibTcsan>true</LibTcsan>
    ...
    </PropertyGroup>
    
  2. プロジェクトのプロパティページから [構成プロパティ]-[サニタイザ] にある スレッドサニタイザの有効化はい に設定します。

    ../_images/tsan-enable.png
  3. 再ビルドし、データアクセス競合が発生するプログラムを実行します。

  4. データアクセス競合が発生すると、自動的にブレークした後、発生した場所がソースコード上で表示され、詳細な内容がデバッグ例外ウインドウに出力されます。


競合発生時の通知について

ソースコード上には、競合が発生した箇所が表示されます。データ競合を検出 をクリックすると、競合が発生した、もう片方のソースコード位置を表示します。

../_images/tsan-data-race-source1.png

デバッグ例外ウィンドウに、競合の詳細な情報が表示されます。

../_images/tsan-data-race-debug-window1.png

Access address

データ競合が検出されたアクセス先のアドレス

Task ID

問題が発生したタスクID

Access size

アクセス幅 (バイト)

Access type

アクセス種別 (ReadまたはWrite)

PC

データ競合が発生した時のプログラムカウンタの値


注意

スレッドサニタイザは全ての競合検出を担保するものではありません。変数競合検出による極端なパフォーマンス低下を防ぐため、 一定の確率での検出となりますが、検出できた競合についてはその競合が確定となります。 そのため、1度のプログラム実行につき、数回しか起こらないようなデータ競合を検出する事は困難です。