これは既に答えられている場合、または私は何かが明らかでない場合は謝罪します。ネストされたアトミック操作はアトミックであることが保証されていますか?
私は、アトミック性の保証がどれほど深いのかを理解しようとしています。std::atomic
です。例えば、我々が持っているなら、
std::atomic<int> a(0);
a.store(1);
があります。しかし、我々はこのようなアトミック操作を、入れ子になった場合はどうなるか:
std::atomic<int> a(0);
std::atomic<int> b(1);
a.store(++b);
私の理解では、++b
がアトミックであるということである、とそうstore()
です。これがにアトミックに2
を格納することが保証されていると仮定するのは正しいですか?
a
と
b
スレッド
T1
と
T2
間で共有される場合にさらに重要なことに、それは両方のスレッドによって実行される
a.store(++b);
がそれぞれアトミック
a
に(それぞれのスレッドで見られるように)
b
のインクリメント値を格納しようとしていることが保証される
糸?言い換えれば、「バット」T2
スレッドとb
をインクリメントすることができますもう一度T1
後には既に一度それをインクリメントしているが、前に結果がT1
でa
に格納されていますか?
がB'は、スレッド間で共有される '仮定に相当し、 'B'の増分はa.store(++ B)'の前に発生する可能性があり、 '。 'a'の値は' 2'を保証しません。 – Jarod42