Вот как используются нормальные, не упрощённые инструкции
Load+Reserve (lr) и Store Conditional (sc): Example 1. Sample code for compare-and-swap function using LR/SC.
# a0 holds address of memory location
# a1 holds expected value
# a2 holds desired value
# a0 holds return value, 0 if successful, !0 otherwise
cas:
lr.w t0, (a0) # Load original value.
bne t0, a1, fail # Doesn't match, so fail.
sc.w t0, a2, (a0) # Try to update.
bnez t0, cas # Retry if store-conditional failed.
li a0, 0 # Set return to success.
jr ra # Return.
fail:
li a0, 1 # Set return to failure.
jr ra # Return.
LR/SC can be used to construct lock-free data structures. An example using LR/SC to implement a compare-and-swap function is shown in Example 1. If inlined, compare-and-swap functionality need only take four instructions.
взято отсюда:
https://www.five-embeddev.com/riscv-user-isa-manual/latest-adoc/a-st-ext
Но у китайцев эти lr/sc вырождены в LW и SW и возврат всегда успешен. Не могу уловить, возврат всегда успешен потому, что в одноядерной системе нет проблемы блокировать доступ к резервированной памяти из прерываний (блокировать прерывания?) между выполнением этих инструкций и потому sc всегда успешно? Или атомарность просто не работает, а инструкции присутствуют формально?