stdatomic — доступ к неинициализированной атомарной закрытой переменной в переполнении стека

Предположим, у меня есть следующий класс:

class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}

private:
std::atomic<uint64_t> n_;
...
...

};

Предположим, что я инициализирую все остальные переменные в классе, кроме n_ и что это не локальное хранилище потока, поэтому нет нулевой инициализации.

Я создаю объект класса A и продолжаю вызывать incrementN(),

Если в какой-то момент я хочу значение n_и я звоню getN()может ли это вызвать load() рутина для атомной n_ врезаться?

5

Решение

Загрузка использует memory_order_seq_cst по умолчанию. Посмотреть здесь: http://en.cppreference.com/w/cpp/atomic/memory_order.

Как упомянуто в комментариях, это не должно создавать проблем, которые не доставят обычные целые. Вас беспокоит переполнение, если неинициализированное начальное значение велико? Смотрите здесь для возможных последствий: https://www.owasp.org/index.php/Integer_overflow

0

Другие решения

Переменная n_ member просто неинициализирована. Доступ к полю вызовет чтение в памяти, и нет причин для сбоя, хотя расположение этих 8 байтов памяти неизвестно.

Тот факт, что член является атомным, здесь не имеет значения. Это заставит компилятор не использовать какую-либо оптимизацию для этой конкретной переменной, а также может вызвать вытеснение строки кэша в ОЗУ при каждой записи.

0

По вопросам рекламы [email protected]