При реализации одной нехитрой структуры данных, которая должна работать в многопоточном приложении, меня сильно насторожило обилие undefined behavior в описании стандарта stdatomic для языка Си. Даже при быстром поиске можно сразу же столкнутся с такими при
инициализации переменной:
Calling this function on an atomic object that has already been initialized (either on construction or by calling this function earlier) causes undefined behavior
If obj was not default-constructed, the behavior is undefined.
И тут возникает вопрос. Допустим у нас есть структура, в которой есть atomic переменная. Выделяя память и инициализируя переменную, мы можем в дальнейшем использовать ее не сталкиваясь с undefined behavior. Но что если таких структур у нас много и их расположение в заранее определенной области памяти может меняться при работе?
Например, я хочу сделать стек, где элементы этого стека будут иметь заранее неизвестный размер (заголовок и следующий за ним произвольный массив). Каждый раз добавляя новый элемент (подчеркну, что в заранее выделенной памяти фиксированного размера), мы должны инициализировать атомарную переменную, а при удалении мы с ней ничего делать не должны, ибо соответствующая функция в стандарте отсутствует. В процессе работы и многократного создания/удаления элементов стека, мы каждый раз инициализируем новую атомарную переменную, которая может быть в памяти где угодно, включая те адреса, где раньше лежала старая переменная. Выходит мы можем инициализировать переменную дважды, а тогда, согласно стандарту, получим undefined behavior. Даже если мы исключаем возможность race condition, безопасно ли использовать атомарные переменные таким способом?
Честно говоря, я совершенно не понимаю, как происходит инициализация таких переменных в современных процессорах и компиляторах. Вероятно для некоторых случаев никакой специальной инициализации и вовсе не нужно, а для некоторых она создает блокировки.