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 также есть статья о спин-замках здесь.

Другие вопросы по тегам