Oracle® Solaris Studio 12.4:线程分析器用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

prime_pthr.c 中的数据争用

要检查 prime_pthr.c 中的数据争用,可以使用在创建数据争用检测实验中创建的实验之一。

要使用 er_print 显示 prime_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

该程序的此次特定运行期间发生了五次数据争用。

要在线程分析器中打开 prime_pthr_inst.er 实验,请键入以下命令:

% tha prime_pthr_inst.er

以下屏幕抓图显示了在 prime_pthr.c 中检测到的争用,如线程分析器所显示。请注意,这些争用与 er_print 所显示的争用相同。

图 2-3  prime_pthr.c 中检测到的数据争用

image:线程分析器窗口的屏幕抓图,显示了关于 prime_pthr.c 数据争用的 “Races“(争用)视图

    prime_pthr.c 中显示了五次数据争用:

  • Race #1(争用 1)是第 26 行函数 is_prime 中对 pflag[ ] 数组的一次写入与同一行中对 pflag[ ] 的另一次写入之间的数据争用。

  • Race #2(争用 2)是第 23 行中对 pflag[ ] 的一次读取与第 26 行函数 is_prime 中对 pflag[ ] 数组的一次写入之间的数据争用。

  • Race #3(争用 3)是第 59 行中对 main() 中内存位置 i 的一次写入与第 39 行中对同一内存位置(在 work() 中为 *arg)的一次读取之间的数据争用。

  • Race #4(争用 4)是第 44 行中对 primes[total] 的一次写入与同一行中对 primes[total] 的另一次写入之间的数据争用。

  • Race #5(争用 4)是第 46 行中对 total 的一次写入与同一行中对 total 的另一次写入之间的数据争用。

如果选择 Race #3(争用 3),然后单击 "Dual Source"(双源)视图,则会看到两个源代码位置,类似于以下屏幕抓图。

图 2-4  数据争用的源代码详细信息

image:线程分析器窗口的屏幕抓图,显示了 “Dual Source“(双源)视图。

Race #3(争用 2)的第一次访问位于第 59 行,显示在顶部面板中。第二次访问位于第 40 行,显示在底部面板中。源代码的左侧会突出显示 "Race Accesses"(争用访问)度量。此度量显示了该行上报告的数据争用访问总次数。