Атомная переменная Vs. Атомная операция
Допустим, у меня есть две общие переменные - a
а также b
- которые связаны друг с другом. Когда несколько приложений совместно используют эти общие переменные, доступ к ним должен быть атомарной операцией, в противном случае связь может нарушиться. Поэтому, чтобы обеспечить взаимное исключение, я помещу их модификации в критическую секцию, защищенную блокировкой.
critical_code
{
P(mutex)
a := something
b := something
V(mutex)
}
Допустим, мое оборудование / ОС / компилятор поддерживает атомарные переменные. Затем я изменил свой код выше, как показано ниже.
code
{
atomic a := something
atomic b := something
}
Может ли этот код обеспечить взаимное исключение при доступе нескольких приложений?
С уважением,
Сринивас Наяк
1 ответ
Нет, вам все еще нужен критический раздел. Несмотря на то, что обновление каждой переменной является атомарным, это все еще не гарантирует ситуации, когда один процесс имеет посредничество только в одной переменной, а другой уже считывает несовместимое состояние.
Вы полагаетесь на атомарные переменные, только когда достаточно знать, что каждая запись и каждое чтение является атомарным - то есть вы уже счастливы, если знаете, что когда один процесс обновляет переменную, другой не будет читать частично измененную переменную.
Таким образом, атомарная переменная является атомарной на одну переменную, а не на набор переменных.