Если вы хотите создать простой критический раздел (используя определение Windows для CRITICAL_SECTION
), вы можете посмотреть следующий псевдо-код:
EnterCS(cs):
If CMPXCHG(cs,0,1) = 0
Return True
Return False
ExitCS:
If CMPXCHG(cs,1,0) = 1
Return True
Return False
Тогдаего использование становится простым случаем:
If EnterCS(cs)
SomeValue <- SomeValue + 10
ExitCS(cs)
Это приобретение на самом деле больше похоже на попытку приобретения, чтобы перейти к более распространенной схеме приобретения CS, мы изменим метод следующим образом
EnterCS(cs):
While CMPXCHG(cs,0,1) != 0
SpinOneCycle()
Return True
У этой простой блокировки есть различные проблемы, такие как невозможность обработки рекурсии, для которой необходимо вести счет рекурсивной блокировки.Я бы порекомендовал использовать что-то, предоставляемое операционной системой.Если вам нужно написать свои собственные блокировки, у Intel есть несколько публикаций по написанию высокопроизводительных и масштабируемых спинлок, вы можете прочитать одну из них для процессоров Xeon здесь и другую для x86 здесь .У Lockless Inc также есть статья о спин-замках здесь .