Существует три общих стиля элементарных примитивов: Compare-Exchange, Load-Linked / Store-Conditional и Compare-And-Swap.
Операция CompareExchange автоматически считывает ячейку памяти и, если онасоответствует значению сравнения, сохраните указанное новое значение.Если прочитанное значение не соответствует значению сравнения, хранилище не создается.В любом случае, операция сообщит о прочтении исходного значения.
Операция Compare-And-Swap аналогична CompareExchange, за исключением того, что она не сообщает, какое значение было прочитано - просто соответствует ли какое-либо значение, которое было прочитано, совпадающемусравнить значение.Обратите внимание, что CompareExchange может использоваться для реализации Compare-And-Swap, сообщая ему, соответствует ли значение, считанное из памяти, указанному значению сравнения.
Комбинация LL / SC позволяет условию операции сохранениянекоторое внешнее влияние могло повлиять на цель, так как ее значение было загружено.В частности, это гарантирует, что, если хранилище преуспевает, местоположение вообще не было написано внешним кодом.Даже если внешний код записал новое значение, а затем переписал исходное значение, это гарантированно приведет к сбою условного кода.Концептуально, это может сделать LL / SC более мощным, чем другие методы, поскольку у него не будет проблемы "ABA".К сожалению, семантика LL / SC допускает самопроизвольный сбой хранилищ, и вероятность самопроизвольного сбоя может быстро возрастать по мере увеличения сложности кода между загрузкой и хранением.Хотя использование LL / SC для реализации чего-то вроде атомарного приращения напрямую будет более эффективным, чем использование его для реализации сравнения и замены, а затем реализация атомарного приращения с использованием этой реализации сравнения и замены в ситуациях, когда необходимоЧтобы сделать многое между загрузкой и хранением, обычно следует использовать LL-SC для реализации сравнения и замены, а затем использовать этот метод сравнения и замены в цикле load-modify-CompareAndSwap.
Из трех примитивов Сравнение-и-своп является наименее мощным, но его можно реализовать с точки зрения любого из двух других.CompareAndSwap может довольно хорошо эмулировать CompareExchange, хотя в некоторых случаях такая эмуляция может привести к блокировке.Ни CompareExchange, ни Compare-And-Swap не могут предложить столь же надежные гарантии, как LL-SC, хотя ограниченный объем кода, который можно надежно поместить в цикл LL / SC, ограничивает полезность его гарантий.