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;
}
_
非参照型の割り当ておよびアクセス操作もアトミックですか?
はい、そうです。 atomic<T>::operator T
およびatomic<T>::operator=
は、それぞれatomic<T>::load
およびatomic<T>::store
と同等です。すべての演算子は、期待どおりにアトミック操作を使用するようにアトミッククラスに実装されています。
「非参照」タイプについてどういう意味かわかりませんか?ここで参照タイプがどのように関連しているかわからない。
両方を実行できますが、load()
/store()
の利点は、メモリの順序を指定できることです。 std::memory_order_relaxed
とatomic<T>::operator T
が最も安全で低速なatomic<T>::operator=
を使用するのに対し、std::memory_order_seq_cst
を指定できる場合は、パフォーマンスにとって重要になることがあります。コードの正確性と読みやすさにとって重要な場合があります。デフォルトのstd::memory_order_seq_cst
が最も安全で正しい可能性が高いですが、読者がどのような操作(取得/解放/消費)を行うかはすぐにはわかりません実行中、またはそのような操作を実行しているかどうか(答えはここでは緩和された順序では不十分ですか?).