В общем, атомарные операции дороги, потому что они требуют межпроцессорной синхронизации. «Нормальная» операция позволяет работать с кэшированными данными, обеспечивая дополнительную скорость. Взять, к примеру, в системе с 2 процессорами:
Тема 1
while (1) x++;
Тема 2
while (1) x++;
Поскольку приращение не является атомарной операцией или защищено барьером памяти, результаты этого в значительной степени не определены. Вы не знаете, как будет увеличен x, или он может даже быть поврежден.
Тема 1
while (1) atomicIncrement(&x);
Тема 2
while (1) atomicIncrement(&x);
Теперь вы пытаетесь получить четко определенное поведение - независимо от порядка, x должен увеличиваться один за другим. Если два потока работают на разных процессорах, они должны либо уменьшить количество разрешенного кэширования, либо иным образом «сравнить заметки», чтобы убедиться, что что-то разумное происходит.
Эти дополнительные издержки могут быть довольно дорогими, и это является основной причиной утверждения о том, что атомарные операции выполняются медленно.