Мне нужно прочитать / записать 16 байтов атомарно. Я пишу только с помощью cmpxchg16, который доступен на всех процессорах x64, за исключением одного неясного AMD.
Теперь вопрос для выровненных 16-байтовых значений, только когда-либо измененных с использованием cmpxchg16 (который действует как полный барьер памяти), возможно ли когда-либо прочитать 16-байтовое расположение, которое является половиной старых данных и половиной новых данных?
Пока я читаю с инструкцией SSE (поэтому поток не может быть прерван в середине чтения), я думаю, что чтение (даже в многопроцессорных системах numa) невозможно для чтения противоречивых данных. Я думаю, что это должно быть атомно.
Я предполагаю, что при выполнении cmpxchg16 он изменяет 16 байтов атомарно, а не записывает два 8-байтовых блока с возможностью для других потоков выполнять чтение между ними (честно говоря, я не понимаю, как это могло бы произойти работать, если это не атомное.)
Я прав? Если я не прав, есть ли способ выполнить атомное 16-байтовое чтение, не прибегая к блокировке?
Примечание: здесь есть пара похожих вопросов , но они не относятся к случаю, когда записи выполняются только с помощью cmpxchg16, поэтому я чувствую, что это отдельный вопрос без ответа.
Редактировать: На самом деле я думаю, что мои рассуждения были ошибочными. Команда загрузки SSE может быть выполнена как два 64-битных чтения, и может быть возможным выполнение cmpxchg16 между двумя чтениями другим процессором.