Атомная переменная Vs. Атомная операция

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

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

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

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

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

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

1 ответ

Решение

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

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

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

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