Какие операции называются неатомарными?
Если можно с примером.
Грубо - которые могут оказаться прерванными другим потоком.
Примеры? Ну, например
if (a) { f(a); }
Пока вы считали a
, которое равно true
, и собрались выполнять f(a)
, другой поток уже сделал a
равным false
:)
Или даже такая экзотика - в одном потоке вы присваиваете значение переменной из двух слов. Первое слово записалось, прерывание, другой поток читает из памяти нечто полузаписанное. Работает, записывает что-то свое. Тут снова управление возвращается к первому потоку, и он дописывает вторую половину нашей переменной...
В C++ атомарными операциями являются лишь операции над std::atomic
, все остальные операции неатомарны.
При соблюдении определенных условий, на определённой архитектуре, атомарными могут быть операции и над «простыми» объектами, но стандартом C++ это не гарантируется. К примеру, есть у Вас такой код:
int64_t var{};
var = -1;
Если мы запустим его на 64-х битной архитектуре (amd64, к примеру) то наверняка операция var = -1
будет атомарной, т.к. шина позволяет записать за один раз все 64 бита, т.е. у нас будет один mov
в ассемблере. Если же мы соберём этот код для 32-х битного процессора (x86, к примеру), то эта операция перестанет быть атомарной и наверняка будет состоять из двух последовательных mov
, т.к. за одну неделимую операцию нельзя в 32-х битную шину засунуть 64 бита данных.
Правда, в процессорах есть достаточно средств, чтобы превращать несколько операций в одну атомарную, но эти средства будут как раз использоваться с std::atomic
. Если же средств процессора для реализации std::atomic
недостаточно, то выходят на более высокий уровень — блокировка мьютексов и прочее. С точки зрения процессора такие операции не могут считаться атомарными, но с точки зрения приложения они будут атомарны, т.к. ни в какой момент времени программа на сможет прочитать частично записанное значение.
Вообще, что атомарно, а что нет надо искать в описании компилятора, для конкретного процессора, например для некоторых DSP присвоение является атомарным, но обычно даже оно не атомарно, для надёжности лучше пользоваться чем то типа std::atomic
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
HELPБез ООП Нужно определить количество столкновений за 1 секунду для заданного количества нульмерных шаров (точек) в одномерном пространстве,...
По заданию, мне нужно написать Sourse filecpp, и в него записать функции
Как передать массив строк (char [10][10]) из модуля C, оттранслированного в WebAssembly, в модуль javascript и обратно?