gpt4 book ai didi

c++ - ThreadSanitizer 说我的 Atomic Inc/Dec 有数据竞争,误报?

转载 作者:太空狗 更新时间:2023-10-29 12:01:09 27 4
gpt4 key购买 nike

我使用 asm 编写了 atomic_inc 来递增整数,它实际上用于引用共享对象的计数。 gcc 4.8.2 -fsanitize=thread 报告数据竞争,我终于发现这可能是由我的 atomic_inc 引起的。我不认为我的代码存在与数据竞争有关的错误,这是 tsan 的误报吗?

static inline int atomic_add(volatile int *count, int add) {
__asm__ __volatile__(
"lock xadd %0, (%1);"
: "=a"(add)
: "r"(count), "a"(add)
: "memory"
);
return add;
}

void MyClass::Ref() {
// std::unique_lock<std::mutex> lock(s_ref);
atomic_add(&_refs, 1);
}
void MyClass::Unref() {
// std::unique_lock<std::mutex> lock(s_ref);
int n = atomic_add(&_refs, -1) - 1;
// lock.unlock();
assert(n >= 0);
if (n <= 0) {
delete this;
}
}

最佳答案

部分问题是 gcc 没有查看 asm 内部。

问题的另一部分是 volatile 不会使变量线程安全。

鉴于 __asm__ 意味着您致力于 gcc,为什么不使用 gcc 内部函数? (它们已被记录并经过充分测试,gcc 将理解它们的语义。)

至于这个警告是不是误报,我不知道。安全的做法是假设问题是真实的。 真的很难在多线程代码中发现问题(即使您知道它们存在)。 (有一次我们使用已发布的失败的互斥算法删除了一段非常聪明的代码,并用一个简单的自旋锁替换它。这修复了失败,但我们永远找不到为什么它失败了。 )

关于c++ - ThreadSanitizer 说我的 Atomic Inc/Dec 有数据竞争,误报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com