Я не уверен, что вы подразумеваете под атомом c обменом, но, возможно, вы имеете в виду инструкцию сравнения и обмена.
- Инструкция сравнения и обмена проверяет ячейку памяти для заданного значения, и если значение в этой ячейке памяти равно заданному значению, она устанавливает ячейку памяти в новое значение. Это делается «атомарно», что означает, что пока эта инструкция выполняется, ничто другое не может выполняться в системе (давайте оставим это так), или выполнение этой инструкции не может быть прервано. Код для этого будет выглядеть примерно так -
function cas(p : pointer to int, old : int, new : int) returns bool {
if *p ≠ old {
return false
}
*p ← new
return true
}
Почему это важно с точки зрения блокировки? Хорошо, предположим, что у вас есть мьютексная «блокировка» и два потока хотят получить доступ к блокировке, каждый поток должен проверить, равно ли значение мьютекса 1, и если оно равно 1, то поток должен установить его на 0. Если поток 1 и поток 2 оба попробуйте выполнить эту операцию одновременно, тогда для случая, когда инструкция не является атомом c, оба потока 1 могли бы видеть значение как 1. Поток 1 попытался бы установить значение 0, но прежде чем он достигнет этого оператора, он получает Затем поток 2 устанавливает значение 0, а затем поток 1 устанавливает его снова. Оба потока могут затем получить блокировку, думая, что они единственные, кто ее получил, что на самом деле является некорректным поведением.
Но если для сравнения и обмена используется атом c, это означает, что если поток находится внутри функции cas, изображенной выше, ни один другой поток не будет выполняться до тех пор, пока он не будет завершен с полным выполнением функции или выполнением гарантированно до sh за 1 цикл. Таким образом, thread1 обновит значение ячейки памяти до 0, а затем поток 2 вернет false.