Подробный ответ о реализации:
Хотя стандарт языка классифицирует это как неопределенное поведение, на самом деле вы можете чувствовать себя в полной безопасности, пока действительно записываете одни и те же данные.
Почему? Аппаратное обеспечение упорядочивает доступ к одной и той же ячейке памяти. Единственное, что может пойти не так, это когда несколько ячеек памяти записываются одновременно, потому что тогда у вас нет аппаратной гарантии того, что доступ к нескольким ячейкам последовательно упорядочен одинаково. Например, если один процесс записывает 0x0000000000000000
, а другой записывает 0xffffffffffffffff
, ваше оборудование может решить по-разному упорядочить доступ к разным байтам, что приведет к чему-то вроде 0x00000000ffffffff
.
Однако если данные, записываемые обоими процессами, одинаковы, то между двумя возможными сериализациями нет заметной разницы, результат детерминирован.
Современное оборудование не обрабатывает доступ к памяти побайтно, вместо этого процессоры взаимодействуют с основной памятью с помощью строк кэша, а ядра обычно могут обмениваться данными со своими кэшами с помощью 8-байтовых слов. Таким образом, установка правильно выровненного указателя является атомарной операцией, на которую можно положиться при реализации алгоритмов без блокировки. Это использовалось в ядре Linux до того, как стали доступны более мощные атомарные операции. C++ формализует это в виде типов atomic<>
, добавляя поддержку аппаратных функций более высокого уровня, таких как запись после чтения, атомарные приращения и тому подобное.
Но, конечно, если вы полагаетесь на детали вашего оборудования, вы действительно должны знать, что делаете, прежде чем делать это. В противном случае придерживайтесь языковых функций, таких как типы atomic<>
, чтобы обеспечить правильную работу и избежать UB.
@Downvoters:
Вопрос не помечен как [language-lawyer], а в ответе явно указано "Подробный ответ на вопрос о реализации". Было намеренно объяснить, как будет выглядеть УБ в программе в реальной жизни. Этот ответ был написан, чтобы дополнить принятый ответ (у которого есть мой положительный отзыв) другим взглядом на вопрос.
person
cmaster - reinstate monica
schedule
13.04.2014