2

各スレッドがオブジェクトに削除のマークを付けることができるマルチスレッドアプリケーションにオブジェクトのクラスがあり、その後、中央のガベージコレクタースレッドが実際にオブジェクトを削除します。スレッドは、内部 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>ますか?

4

2 に答える 2