0

以下代码在数组的索引上使用 lock_cmpxchg 获取互斥锁,然后两个线程写入和读取相同的索引,但线程清理程序仍然说存在数据竞争。我怎么能告诉他线程之间有一个锁,因为它似乎没有检测到它。

 aquire_mutex(bool* lock_ptr)
 {
   retval = _lock_cmpxchg_8bit(0, 1, lock_ptr); //lock_cmpxchg implemented in inline assembly
   return (retval == 0) ? 1: 0;
 }

foo()
{
  if (aquire_mutex(global_lock[index])!= 1)
  {
    return error;
  }
  uint x = array[index];
  ...
  array[index] = random_value;
}

流程是:很多线程使用不同的索引或相同的索引运行,如果两个线程具有相同的索引,则会出现唯一的数据竞争,但它有一个锁。但线程清理器警告 uint x = array[index]; 线程 1 有一个读取行并且有一个写入行 array[index] = random_value ; 我不知道为什么它会检测到数据竞争,感谢您的帮助!

4

1 回答 1

0

正如 Hasturkun 所建议的那样,问题在于 Thread Sanitizer 对内联程序集一无所知,因此他没有将其检测为锁,我使用 __sync_bool_compare_and_swap 构建 GCC 内在函数,现在线程清理程序不会报告任何假阴性!

根据德米特里·维尤科夫 https://github.com/google/sanitizers/issues/1443

于 2021-09-01T06:28:25.990 回答