Здесь есть две проблемы: ваш указанный c код и ваш общий вопрос.
В вашем указанном c коде, даже в лучшем из возможных сценариев (где t2
выполняется после t1
), у вас есть гонка данных из-за отсутствия синхронизации между созданием и использованием. И это делает ваш код UB независимо от порядка выполнения.
В общем вопросе давайте предположим, что конструктор типа передает указатель this
другому потоку, который затем вызывает функции для него и сама передача должным образом синхронизирована. Будет ли какой-то другой поток, вызывающий функцию-член, считаться гонкой данных?
Что ж, это определенно будет гонка данных, если другой поток вызовет функцию, которая считывает значения членов или другие данные, записанные конструктором после точка передачи обслуживания, или если конструктор обращается к членам или другим данным, записанным вызываемой функцией-членом. То есть, если между кодом, выполняемым одновременно, нет гонок данных.
Если предположить, что ни один из этих случаев не подходит, тогда все должно быть хорошо (в основном. Можно определить A
таким образом что ваш reinterpret_cast
не возвращает пригодный для использования указатель на A
, который вы создали в этом хранилище; вам потребуется launder
it ). Доступ к строящемуся / разрушаемому объекту возможен, но только определенным образом. Придерживайтесь этих путей, и у вас все будет хорошо ... с одним возможным уловом.
В этом ничего нет Стандарт о гонках данных при завершении инициализации объекта, только при конфликтах в ячейках памяти. Как только объект полностью сконструирован, поведение virtual
функций может измениться в зависимости от изменения указателей vtable и тому подобное, если тип dynamici c является классом, производным от класса, данного другому потоку. Я не верю, что в разделе об объектной модели есть четкое утверждение об этом.
Также обратите внимание, что C ++ 20 добавил специальное правило к class.cdtor :
Во время конструирования объекта, если к значению объекта или любому из его подобъектов обращаются через glvalue, который не получен, прямо или косвенно, из указателя this
конструктора, значение полученный таким образом объект или подобъект не указан.