web-dev-qa-db-ja.com

アトミックロード/アトミックを明示的に呼び出す必要がありますか?

C++ 11は _std::atomic<>_ テンプレートライブラリを導入しました。この規格では、store()およびload()操作を指定して、複数のスレッドで共有される変数をアトミックに設定/取得しています。

私の質問は、割り当てとアクセス操作もアトミックですか?

つまり、

_std::atomic<bool> stop(false);
...
void thread_1_run_until_stopped()
{
    if(!stop.load())
        /* do stuff */
}

void thread_2_set_stop()
{        
    stop.store(true);
}
_

に相当:

_void thread_1_run_until_stopped()
{
    if(!stop)
        /* do stuff */
}

void thread_2_set_stop()
{        
    stop = true;
}
_
43
bavaza

非参照型の割り当ておよびアクセス操作もアトミックですか?

はい、そうです。 atomic<T>::operator Tおよびatomic<T>::operator=は、それぞれatomic<T>::loadおよびatomic<T>::storeと同等です。すべての演算子は、期待どおりにアトミック操作を使用するようにアトミッククラスに実装されています。

「非参照」タイプについてどういう意味かわかりませんか?ここで参照タイプがどのように関連しているかわからない。

37
Andrew Tomazos

両方を実行できますが、load()/store()の利点は、メモリの順序を指定できることです。 std::memory_order_relaxedatomic<T>::operator Tが最も安全で低速なatomic<T>::operator=を使用するのに対し、std::memory_order_seq_cstを指定できる場合は、パフォーマンスにとって重要になることがあります。コードの正確性と読みやすさにとって重要な場合があります。デフォルトのstd::memory_order_seq_cstが最も安全で正しい可能性が高いですが、読者がどのような操作(取得/解放/消費)を行うかはすぐにはわかりません実行中、またはそのような操作を実行しているかどうか(答えはここでは緩和された順序では不十分ですか?).

18
Serge Rogatch