CMPXCHG и критическая секция реализации
Оператор CMPXCHG работает следующим образом:
CMPXCHG (common, old, new):
int temp
temp <- common
if common = old then
common <- new
return temp
Какой самый простой из возможных алгоритмов для реализации критической секции, если доступна атомарная инструкция CMPXCHG?
1 ответ
Если вы хотите создать простой критический раздел (используя определение WindowsCRITICAL_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 также есть статья о спин-замках здесь.