Атомная переменная Vs. Атомная операция - PullRequest
3 голосов
/ 19 мая 2010

Допустим, у меня есть две общие переменные - a и b - которые связаны друг с другом. Когда несколько приложений совместно используют эти общие переменные, доступ к ним должен быть атомарной операцией, в противном случае связь может нарушиться. Поэтому, чтобы обеспечить взаимное исключение, я помещу их модификации в критическую секцию, защищенную блокировкой.

critical_code
{
    P(mutex)
    a := something
    b := something
    V(mutex)
}

Допустим, мое оборудование / ОС / компилятор поддерживает атомарные переменные. Затем я изменил свой код выше следующим образом.

code
{
    atomic a := something
    atomic b := something
}

Может ли этот код обеспечить взаимное исключение при доступе из нескольких приложений?

С уважением,
Сринивас Наяк

1 Ответ

6 голосов
/ 19 мая 2010

Нет, вам все еще нужен критический раздел. Несмотря на то, что обновление каждой переменной является атомарным, это по-прежнему не гарантирует ситуации, когда один процесс имеет посредничество только одной переменной, а другой уже считывает несовместимое состояние.

Вы полагаетесь на атомарные переменные, только когда достаточно знать, что каждая запись и каждое чтение является атомарным - то есть вы уже счастливы, если знаете, что, когда один процесс обновляет переменную, другой не будет читать частично измененную переменная.

Таким образом, атомарная переменная является атомарной на одну переменную, а не на набор переменных.

...