Я говорю, что самый простой способ думать о блокировке - это инструкция атомного обмена. Следующее приобретает блокировку X.
LOCK:
set RegisterA = 1
Atomic_Exchange(X, RegisterA) //runs such that no other thread can work with X
if RegisterA == 1:
Means X was 1 when I esecuted the exchange thus someone else has the lock
Since I do not have the lock, goto LOCK
else:
If A is zero, it means I was the first one to set X to 1, which means I own the lock
UNLOCK:
X = 0
Атомный обмен существует в большинстве компьютеров. Intel x86 имеет инструкцию EXCHG для этого. Только для справки, у Intel x86 также есть инструкция сравнения и обмена, которая позаботится о приобретении, а также о сравнении для вас. По сути, вместо того, чтобы сначала выполнять обмен, а затем выполнять тестирование в программном обеспечении, он использует аппаратное обеспечение и выполняет обмен только в том случае, если X == 0 для начала. Это экономит дополнительную запись в переменную X, что уменьшает количество кеш-пропусков для X, что приводит к повышению производительности.