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

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

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

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

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

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

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


person Community    schedule 19.05.2010    source источник


Ответы (1)


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

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

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

person sharptooth    schedule 19.05.2010