我在多线程应用程序中有一类对象,其中每个线程都可以标记要删除的对象,然后中央垃圾收集器线程实际上会删除该对象。线程通过访问内部布尔值的成员方法进行通信:
class MyObjects {
...
bool shouldBeDeleted() const
{
return m_Delete;
}
void
markForDelete()
{
m_Delete = true;
}
...
std::atomic< bool > m_IsObsolete;
}
由于 Thread Sanitizer 一直在抱怨,该 bool 过去已被其他人设为原子。但是,perf 现在表明在内部原子负载期间存在处理开销:
│ ↓ cbz x0, 3f4
│ _ZNKSt13__atomic_baseIbE4loadESt12memory_order():
│ {
│ memory_order __b = __m & __memory_order_mask;
│ __glibcxx_assert(__b != memory_order_release);
│ __glibcxx_assert(__b != memory_order_acq_rel);
│
│ return __atomic_load_n(&_M_i, __m);
│ add x0, x0, #0x40
86,96 │ ldarb w0, [x0]
目标平台是 GCC、Aarch64 和 Yocto Linux。
现在我的问题如下:
在这种情况下真的需要原子吗?bool 的转换是一种方式(从 false 到 true),在对象存在时无法返回,因此不一致仅意味着对象稍后被删除,对吗?
是否有替代方案可以
std::atomic<bool>
使 Thread Sanitizer 静音但在计算上比 Thread Sanitizer 便宜std::atomic<bool>
?