На x86 предположим, что у меня есть несогласованный элемент данных, который охватывает границу строки кэша, например, адреса 0x1fff через 0x2003, содержащие 32-битное значение 20-битного разряда 0x11223344. Если поток A на ядре A записывает 0x55667788 на этот адрес, а поток B на ядре B «одновременно» делает чтение одного и того же адреса, может ли этот поток B потенциально читать сочетание старого и нового значения?многоядерный x86 чтение или запись несогласованных данных
Другими словами, поскольку несогласованная запись A будет разбита процессором на однобайтную запись 0x88 на адрес 0x1fff и трехбайтную запись 0x556677 на адрес 0x2000, возможно ли, что чтение B может произойти в середине этой несогласованной записи и завершить чтение 0x11223388 (или, если запись разделена в обратном порядке, 0x55667711)? Очевидно, что желательно, чтобы прочитанное возвращало либо старое значение, либо новое, и мне все равно, какая, но не смесь.
В идеале я ищу не только ответ на вопрос, но и авторитетную цитату из конкретных подтверждающих утверждений в руководствах по архитектуре Intel или AMD.
Я пишу симулятор для многопроцессорной системы с экзотической архитектурой процессора, и в этой системе существуют сильные гарантии атомарности доступа к памяти даже для неверно данных, поэтому сценарий, который я описываю, не может произойти. Если я смоделирую каждый процессор как отдельный поток на x86, я должен убедиться, что он не может произойти и на x86. Информация, которую я прочитал о гарантиях порядка доступа к памяти на x86, явно не учитывает случаи несогласованности.