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