Ваши встроенные ограничения asm выглядят правильно, это должно компилироваться так, как вы планировали. Вероятно, вы могли бы использовать "+m" (*h)
, чтобы компилятор мог выбрать режим адресации вместо жесткого кодирования его с помощью "r"(h)
и [%2]
.
Что касается порядка, ldr
упорядочивается по зависимости после ldxr (например, C11 memory_order_consume
), так что это работает.
Но str
между LL / S C в insert
может не стать видимым до после stxr
публикует адрес в других потоках. Так что я думаю вам нужно stlxr
(релиз-магазин) в insert
.
Выполнение дополнительной загрузки или сохранения между LDXR / STXR небезопасно. В статье LL / S C Википедии упоминается, что некоторые реализации могут ложно выйти из строя, если вы выполните любую загрузку или сохранение между LL и S C. Wiki сообщает, что PowerP C специально это допускает. Но AArch64 в целом явно не делает: в соответствии с руководством по ARM ( см. Комментарий @James Greenhalgh ):
Циклы LoadExcl / StoreExcl гарантируют только продвижение вперед if [...] Между Load-Exclusive и Store-Exclusive нет явных обращений к памяти.
Могут быть некоторые процессоры AArch64, где вы создадите бесконечный l oop из stxr
сбой, но могут быть и другие, где это работает. Если на практике это работает на тестируемом вами процессоре, вероятно, неплохо было бы посмотреть, есть ли какая-либо документация, подтверждающая это.
Это, скорее всего, будет проблемой, если узел new_
окажется в та же строка кэша (или блок LL / S C эксклюзивности), что и головной узел. Убедитесь, что вы проверили этот случай или каким-то образом сделаете его невозможным, если это вообще работает на микроархитектуре (ах), о которых вы заботитесь.
В остальном, я думаю, ваш общий алгоритм выглядит правильным, поэтому, если вы протестировали его и обнаружили, что он работает, это, вероятно, хорошо.
Однако я не очень тщательно продумывал ваш алгоритм; У меня также нет опыта разработки или использования вещей, связанных с необработанным LL / S C. Я в принципе знаю, как они работают, но не готов сказать, что это определенно правильно. Я не вижу никаких проблем после того, как немного подумал об этом, но это не значит, что их нет.