Атомарное чтение 16 байт на процессорах x64

Мне нужно прочитать/записать 16 байтов атомарно. Я пишу только с помощью cmpxchg16, который доступен на всех процессорах x64, кроме, я думаю, одного малоизвестного AMD.

Теперь вопрос заключается в том, что для выровненных 16-байтовых значений, которые когда-либо изменялись с помощью cmpxchg16 (который действует как полный барьер памяти), возможно ли когда-либо прочитать 16-байтовое местоположение, которое наполовину состоит из старых данных, а наполовину из новых?

Пока я читаю с инструкцией SSE (поэтому поток не может быть прерван в середине чтения), я думаю, что невозможно (даже в многопроцессорных системах numa) для чтения увидеть несогласованные данные. Я думаю, что это должно быть атомарно.

Я предполагаю, что при выполнении cmpxchg16 он изменяет 16 байтов атомарно, а не путем записи двух 8-байтовых блоков с возможностью чтения другими потоками между ними (честно говоря, я не понимаю, как это могло бы произойти). работало бы, если бы оно не было атомарным.)

Я прав? Если я ошибаюсь, есть ли способ выполнить атомарное чтение 16 байт, не прибегая к блокировке?

Примечание. Здесь есть пара похожих вопросов, но они не относятся к случаю, когда запись выполняется только с помощью cmpxchg16, поэтому я считаю, что это отдельный вопрос без ответа.

Редактировать: На самом деле я думаю, что мои рассуждения были ошибочными.Инструкция загрузки SSE может выполняться как два 64-битных чтения, и cmpxchg16 может выполняться между двумя чтениями другим процессором.

11
задан Community 23 May 2017 в 11:52
поделиться