通过线程清理器忽略数据争用报告

Ignore data race report by thread sanatizer

提问人:chrysante 提问时间:11/11/2023 更新时间:11/11/2023 访问量:39

问:

如何告诉 Clangs 线程清理器忽略检测到的数据争用?

我的程序有一个数据竞争,我不介意,也不想“修复”。我有一个调试UI,可以观察动态系统。系统在不断变化,UI 从另一个线程读取系统的值。这显然有数据竞争,但据我了解,系统中的数据不应该受到来自另一个线程的读取的影响,我不介意有时调试UI是否显示垃圾值。此外,使系统使用同步会在运行时和开发时产生不必要的开销。

我认为这不是问题是否正确,有没有办法告诉线程清理器忽略数据竞争?

我想在这种情况下,标准 C++ 很少或根本没有保证,但我特别想知道 x86 架构上的行为。

为了便于演示,下面是一个示例:

double sharedValue = 0.0;

void logicThread() {
    while (true) {
        sharedValue += 0.333;
    }
}

void uiTread() {
    while (window.open()) {
        window.display(sharedValue);
    }
}
C++ clang 线程安全

评论

0赞 Artyer 11/11/2023
你不需要同步,只需要原子性。把它改成和是不是太过分了?std::atomic<double> sharedValue = 0.0;sharedValue = sharedValue + 0.333;
1赞 user4581301 11/11/2023
您不仅要担心在不方便的时间更新值和打印垃圾,还要担心优化器。由于在 while 循环中从不更改,因此编译器可以很好地优化为类似 .适当的同步将解决此问题。sharedValueuiTreadwindow.display(sharedValue);window.display(some_constant_value);
0赞 chrysante 11/11/2023
@user4581301是的,我在发布问题后不久就想到了这一点。我认为在我的程序中,读取是足够绝缘的,我不使用 LTO,所以这应该不是问题,但你的观点仍然是正确的。
0赞 chrysante 11/11/2023
@Artyer这将是一个实质性的变化。共享值实际上是一个值数组,到处都使用指向该数组元素的指针,更改它们将非常耗时。我有点担心性能,因为原子禁止许多优化,但我当然没有进行基准测试。
2赞 user4581301 11/11/2023
一种选择:不要让后台任务直接在 上做很多工作。取而代之的是,让他们在更本地的东西上操作,并以合理的时间间隔支付更新.如果你有能力显示偶尔的垃圾值,你也许可以承受它不是实时的。sharedValuestd::atomicsharedValue

答: 暂无答案