以下代码在数组的索引上使用 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 ;
我不知道为什么它会检测到数据竞争,感谢您的帮助!