Атомик происходит от греческого ἄτομος (атомос), что означает «неделимый». (Предостережение: я не говорю по-гречески, так что, возможно, это действительно что-то другое, но большинство англоговорящих людей, ссылаясь на этимологию, интерпретируют это так. :-)
В вычислениях это означает, что операция происходит. Нет никакого промежуточного состояния, которое было бы видимым до его завершения. Поэтому, если ваш ЦП прерывается для обслуживания оборудования (IRQ), или если другой ЦП читает ту же самую память, это не влияет на результат, и эти другие операции будут считать его завершенным или не запущенным.
В качестве примера ... предположим, вы хотите установить переменную для чего-то, но только если это не было установлено ранее. Возможно, вы захотите сделать это:
if (foo == 0)
{
foo = some_function();
}
Но что, если это будет выполняться параллельно? Может случиться так, что программа получит foo
, увидит его как ноль, в то время как поток 2 делает то же самое и устанавливает какое-то значение. Вернувшись в исходный поток, код по-прежнему считает, что foo
равен нулю, и переменная назначается дважды.
Для подобных случаев ЦП предоставляет некоторые инструкции, которые могут выполнять сравнение и условное присвоение как атомарную сущность. Следовательно, test-and-set, compare-and-swap и load-connected / store-conditional. Вы можете использовать их для реализации блокировок (ваша ОС и ваша библиотека C сделали это). Или вы можете написать разовые алгоритмы, которые полагаются на примитивы, чтобы что-то делать. (Здесь есть кое-что интересное, но большинство простых смертных избегают этого, опасаясь ошибиться.)
person
asveikau
schedule
19.11.2009