Предположим, у меня есть следующий класс:
class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}
private:
std::atomic<uint64_t> n_;
...
...
};
Предположим, что я инициализирую все остальные переменные в классе, кроме n_
и что это не локальное хранилище потока, поэтому нет нулевой инициализации.
Я создаю объект класса A и продолжаю вызывать incrementN()
,
Если в какой-то момент я хочу значение n_
и я звоню getN()
может ли это вызвать load()
рутина для атомной n_
врезаться?
Загрузка использует memory_order_seq_cst по умолчанию. Посмотреть здесь: http://en.cppreference.com/w/cpp/atomic/memory_order.
Как упомянуто в комментариях, это не должно создавать проблем, которые не доставят обычные целые. Вас беспокоит переполнение, если неинициализированное начальное значение велико? Смотрите здесь для возможных последствий: https://www.owasp.org/index.php/Integer_overflow
Переменная n_ member просто неинициализирована. Доступ к полю вызовет чтение в памяти, и нет причин для сбоя, хотя расположение этих 8 байтов памяти неизвестно.
Тот факт, что член является атомным, здесь не имеет значения. Это заставит компилятор не использовать какую-либо оптимизацию для этой конкретной переменной, а также может вызвать вытеснение строки кэша в ОЗУ при каждой записи.