在x86上,假設我有一個跨越緩存行邊界的未對齊數據項,例如地址0x1fff至0x2003包含小尾數32位值0x11223344。如果核心A上的線程A向該地址寫入0x55667788,並且核心B上的線程B「同時」讀取了相同的地址,那麼線程B是否可能讀取舊值和新值的混合?換句話說,由於A的錯位寫入將被處理器分解爲一個字節的0x88寫入地址0x1fff和一個三字節寫入0x556677到地址0x2000,有可能B的讀取可能發生在錯位寫入的中間,並且讀取0x11223388(或者,如果寫入按相反順序分解,則爲0x55667711)?顯然,理想的行爲是讀取返回舊值或新值,我不關心哪一個,但不是混合。多核x86讀取或寫入未對齊的數據
理想情況下,我正在尋找的不僅僅是這個問題的答案,而是在Intel或AMD體系結構手冊中對權威引用的具體支持性陳述。
我正在爲具有奇特處理器架構的多處理器系統編寫模擬器,並且在該系統中即使對於未對齊的數據也有強大的內存訪問原子性保證,所以我描述的場景不會發生。如果我將每個CPU模擬爲x86上的單獨線程,則需要確保它不會發生在x86上。我讀過的有關x86上的內存訪問順序保證的信息並未明確涵蓋未對齊的情況。