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