Sun Studio 12:线程分析器用户指南

2.6.2 用于验证数组值类型的程序

一组线程并发调用 check_bad_array() 以检查数组 data_array 是否有元素已损坏。每个线程检查数组的不同部分。如果线程发现某元素已损坏,则它会将全局共享变量 is_bad 的值设置为 true。

20  volatile int is_bad = 0;
 ...

 100  /* 
 102   * Each thread checks its assigned portion of data_array, and sets 
 102   * the global flag is_bad to 1 once it finds a bad data element.
 103   */
 104  void check_bad_array(volatile data_t *data_array, unsigned int thread_id)    
 105  {
 106     int i;
 107     for (i=my_start(thread_id); i<my_end(thread_id); i++) {
 108          if (is_bad) 
 109              return;
 110          else {
 111              if (is_bad_element(data_array[i])) { 
 112                  is_bad = 1;
 113                  return;
 114              }
 115          }
 116     }
 117  }

第 108 行上 is_bad 的读取和第 112 行上 is_bad 的写入之间存在数据争用。但是,该数据争用不会影响最终结果的正确性。

is_bad 的初始值为零。当线程更新 is_bad 时,它们为其分配值一。即,线程在 is_bad 的同一内存字节的同一位中存储一。在当前的体系结构中,可以假定那些存储是原子的。因此,当线程读取 is_bad 时,读取的值要么是零,要么是一。如果线程在为其分配值一之前检查 is_bad(第 108 行),则它继续执行 for 循环。如果在此期间,另一个线程为 is_bad(第 112 行)分配值一,则不会更改最终结果。这仅仅意味着,线程执行 for 循环的时间超过了所需时间。