各スレッドがオブジェクトに削除のマークを付けることができるマルチスレッドアプリケーションにオブジェクトのクラスがあり、その後、中央のガベージコレクタースレッドが実際にオブジェクトを削除します。スレッドは、内部 bool にアクセスするメンバー メソッドを介して通信します。
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>
スレッドサニタイザーを沈黙させますが、より計算的に安価な代替手段はありstd::atomic<bool>
ますか?