ThreadSanitizer说我的spin_lock有数据竞赛,但如何
ThreadSanitizer says my spin_lock has data race, but how?
我的自旋锁实现如下所示,我认为它不会导致任何数据竞争,但是当我使用 -fsanitize=thread 测试我的代码时,它会报告spin_unlock有写入数据竞赛。怎么会这样?是误报吗?
#define barrier() asm volatile("": : :"memory")
#define cpu_relax() asm volatile("pausen": : :"memory")
static inline void spin_lock(volatile int *lock) {
while (1)
{
int i = 0;
if (!atomic_swap(lock, EBUSY)) return;
while (*lock) {
i++;
if (i == 4000) {
i = 0;
thread_yield();
}
cpu_relax();
}
}
}
static inline void spin_unlock(volatile int *lock) {
barrier();
*lock = 0;
}
atomic_swap是一个函数,如下所示:
static inline int atomic_swap(volatile void *lockword, int value) {
unsigned long tmp;
int result;
__asm__ __volatile__ ("dmb" : : : "memory");
__asm__ __volatile__("@ atomic_swapn"
"1: ldrex %0, [%2]n"
" strex %1, %3, [%2]n"
" teq %1, #0n"
" bne 1b"
: "=&r" (result), "=&r" (tmp)
: "r" (lockword), "Ir" (value)
: "cc");
__asm__ __volatile__ ("dmb" : : : "memory");
return result;
}
ThreadSanitizer不知道你家atomic_swap()
或barrier()
函数的语义。从线程清理器常见问题解答:
问:支持哪些同步原语?TSan 支持 pthread 同步原语、内置编译器原子操作(sync/atomic)C++ llvm libc++ 支持的操作(尽管没有经过非常彻底的 [原文如此] 测试)。
所以它不知道atomic_swap()
应该做什么,最重要的是,ThreadSanitizer目前不支持内存围栏。
相关文章:
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 潜在的数据竞赛是数据竞赛吗?
- 并行std::for_each中的数据竞赛
- 在 DirectX 中跨线程传递纹理的数据竞赛
- 仅当数据竞赛存在与锁定时,OpenMP关键部分
- 什么形式上保证了非原子变量不能看到凭空出现的值,并像理论上原子一样创造数据竞赛?
- std::future::wait 是内存障碍吗?(我无法解释这种数据竞赛)
- 加入线程后,是访问共享数据的数据竞赛吗?
- C++ mac OS X El Capitan上的openmp,Valgrind错误(数据竞赛)
- 确定是否将对象分配在静态内存块中(还是如何避免数据竞赛条件)
- C++shared_ptr和threadsantiazer报告数据竞赛
- C++内存模型——这个例子包含数据竞赛吗
- OpenMP C++与zheevr的数据竞赛
- 对共享变量的无保护访问是否总是数据竞赛
- ThreadSanitizer说我的spin_lock有数据竞赛,但如何
- 数据竞赛?段错误,但问题在哪里
- 集成瓦尔格林德输出以找出数据竞赛的位置
- c++openmp shared_ptr数据竞赛
- 使用原子<bool>的简单自旋锁中的数据竞赛
- CUDA还原和样本:数据竞赛