Предположим, у нас есть реализация spinlock
:
struct Lock {
locked : Atomic(bool),
}
Тогда функция разблокировки может быть:
fun unlock(lock : &Lock) {
atomic_store(&lock.locked, false, release);
}
А как же lock
? Обычно он использует сравнение и замену следующим образом:
fun lock(lock : &Lock) {
while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}
Но разве обмена для этого недостаточно? Что-то вроде этого:
fun lock(lock : &Lock) {
while atomic_swap(&lock.locked, true, acquire) {}
}
Есть ли какие-либо проблемы с этим?