私はシングルライターで、複数の読者の状況があります。あるスレッドが書き込みを行っているカウンタがあり、スレッドがこのカウンタを読み取る可能性があります。シングルスレッドはデータアクセスのために他のスレッドとの競合を心配する必要はないので、次のコードは安全ですか?atomic_loadのない原子変数を読み取ることはできますか?
#include <stdatomic.h>
#include <stdint.h>
_Atomic uint32_t counter;
// Only 1 thread calls this function. No other thread is allowed to.
uint32_t increment_counter() {
atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed);
return counter; // This is the line in question.
}
// Any thread may call this function.
uint32_t load_counter() {
return atomic_load_explicit(&counter, memory_order_relaxed);
}
ライター・スレッドはただのatomic_load*
機能を呼び出すことなく、直接counter
を読み込みます。これは安全でなければなりません(複数のスレッドが値を読み取ることは安全です)。しかし、変数_Atomic
を宣言すると、その変数を直接使用することが制限されているか、 atomic_load*
機能
私は厳格な答えは「いいえ、それは安全ではない」であることをベンチャーだろうが、私は実際に右のそれを研究する時間がありません。今。更新可能な原子変数を直接読み取ろうとすると、更新自体がアトミックであるとみなされます。しかし、変数の更新がアトミックな場合、明示的にアトミックにする必要はありません。 –