Oracle® Solaris Studio 12.4: スレッドアナライザユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

prime_pthr.c でのデータの競合

prime_pthr.c でのデータの競合を調べるには、データの競合の検出実験を作成するで作成したいずれかの実験を使用できます。

er_printprime_pthr_instr.er 実験のデータの競合情報を表示するには、次のコマンドを入力します。

% er_print prime_pthr_inst.er

(er_print) プロンプトで races と入力すると、次のような出力が表示されます。

(er_print) races



Total Races:  5 Experiment:  prime_pthr_inst.er

Race #1, Vaddr: 0x28c28
      Access 1: Write, line 26 in "prime_pthr.c",
                       is_prime + 0x0000022C
      Access 2: Write, line 26 in "prime_pthr.c",
                       is_prime + 0x0000022C
  Total Callstack Traces: 2

Race #2, Vaddr: (Multiple Addresses)
      Access 1: Read,  line 23 in "prime_pthr.c",
                       is_prime + 0x000000E4
      Access 2: Write, line 26 in "prime_pthr.c",
                       is_prime + 0x0000022C
  Total Callstack Traces: 2

Race #3, Vaddr: 0xffbff5bc
      Access 1: Write, line 59 in "prime_pthr.c",
                       main + 0x000001F4
      Access 2: Read,  line 39 in "prime_pthr.c",
                       work + 0x0000006C
  Total Callstack Traces: 1

Race #4, Vaddr: 0x216f0
      Access 1: Write, line 44 in "prime_pthr.c",
                       work + 0x00000174
      Access 2: Write, line 44 in "prime_pthr.c",
                       work + 0x00000174
  Total Callstack Traces: 2

Race #5, Vaddr: (Multiple Addresses)
      Access 1: Write, line 43 in "prime_pthr.c",
                       work + 0x0000012C
      Access 2: Write, line 43 in "prime_pthr.c",
                       work + 0x0000012C
  Total Callstack Traces: 1

この特定のプログラム実行中に、5 つのデータの競合が生じました。

スレッドアナライザで prime_pthr_inst.er 実験結果を開くには、次のコマンドを入力します。

% tha prime_pthr_inst.er

次のスクリーンショットには、スレッドアナライザに表示された、prime_pthr.c で検出された競合が示されています。er_print で示された競合と同じであることに注意してください。

図 2-3  prime_pthr.c で検出されたデータの競合

image:prime_pthr.c の「競合」ビューを表示した「スレッドアナライザ」ウィンドウのスクリーンショット

    prime_pthr.c には、次の 5 つのデータの競合が示されています。

  • Race #1 は、行 26 での関数 is_prime における pflag[ ] 配列への書き込みと、同じ行での pflag[ ] への別の書き込みとのデータの競合です。

  • Race #2 は、行 23 での pflag[ ] の読み取りと、行 26 での 関数 is_prime における pflag[ ] 配列への書き込みとのデータの競合です。

  • Race #3 は、行 59 での main() における i というメモリー位置への書き込みと、行 39 での (work() における *arg という) 同じメモリー位置からの読み取りとのデータの競合です。

  • Race #4 は、行 44 での primes[total] への書き込みと、同じ行での primes[total] への別の書き込みとのデータの競合です。

  • Race #5 は、行 46 での total への書き込みと、同じ行での total への別の書き込みとのデータの競合です。

Race #3 を選択したあとに「デュアルソース」ビューをクリックした場合、次のスクリーンショットのように、2 つのソース位置が表示されます。

図 2-4  データの競合のソースコード詳細

image:「デュアルソース」ビューを示した「スレッドアナライザ」ウィンドウのスクリーンショット。

Race #3 の最初のアクセスは行 59 で行われ、上部のパネルに表示されます。2 番目のアクセスは行 40 で行われ、下部のパネルに表示されます。ソースコードの左側に「競合アクセス」メトリックが強調表示されます。このメトリックは、その行でデータの競合アクセスが報告された回数を示します。