У меня ситуация с одним писателем, с несколькими читателями. Есть счетчик, на который пишет один поток, и любой поток может читать этот счетчик. Поскольку для одного потока записи не нужно беспокоиться о борьбе с другими потоками для доступа к данным, безопасен ли следующий код?Могу ли я читать атомную переменную без atom_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);
}
Автор Тема просто читает counter
непосредственно без вызова каких-либо функций atomic_load*
. Это должно быть безопасным (поскольку для нескольких потоков можно прочитать значение), но я не знаю, запрещает ли объявление переменной _Atomic
использовать эту переменную или если вы всегда должны ее читать, используя один из atomic_load*
функции.
Рискну предположить, что строгий ответ: «Нет, это не безопасно», но у меня нет времени на самом деле исследовать это правильно Теперь. Попытка прямого чтения другой атомной переменной, которая может быть обновлена, предполагает, что само обновление является атомарным. Но если обновление переменной было атомарным, не было бы необходимости явно сделать его атомарным. –