CMPXCHG и критическая секция реализации - PullRequest
0 голосов
/ 10 мая 2018

Оператор CMPXCHG работает следующим образом:

CMPXCHG (common, old, new):
    int temp
    temp <- common
    if common = old then
           common <- new
    return temp    

Какой самый простой возможный алгоритм для реализации критической секции, если доступна атомарная инструкция CMPXCHG?

1 Ответ

0 голосов
/ 11 мая 2018

Если вы хотите создать простой критический раздел (используя определение 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 также есть статья о спин-замках здесь .

...