Атомарные операции
Что такое атомарная операция?
Атомарная операция неделима с точки зрения других потоков, обращающихся к тому же атомарному объекту. Это не означает запрета прерывания потока планировщиком и не гарантирует lock-free или wait-free выполнение. Несколько отдельных атомарных операций не образуют автоматически одну атомарную транзакцию.
Пример использования std::atomic:
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<int> counter(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
counter++;
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Counter: " << counter << std::endl;
return 0;
}
Основные характеристики:
-
Неделимость: Операция выполняется полностью или не выполняется вовсе.
-
Безопасность: Корректно используемые атомарные обращения исключают гонку на самом атомарном объекте. Для согласования других данных и составных инвариантов нужны подходящий memory_order и протокол синхронизации.
-
Производительность зависит от типа, реализации и конкуренции. Проверяйте is_lock_free(): реализация некоторых атомарных типов может использовать блокировки.
Атомарные операции полезны для простых операций над переменными, таких как инкременты, декременты и обмен значениями, обеспечивая при этом безопасность данных в многопоточных программах.