Неатомарные операции С++

329
17 мая 2017, 08:56

Какие операции называются неатомарными?
Если можно с примером.

Answer 1

Грубо - которые могут оказаться прерванными другим потоком.

Примеры? Ну, например

if (a) { f(a); }

Пока вы считали a, которое равно true, и собрались выполнять f(a), другой поток уже сделал a равным false :)

Или даже такая экзотика - в одном потоке вы присваиваете значение переменной из двух слов. Первое слово записалось, прерывание, другой поток читает из памяти нечто полузаписанное. Работает, записывает что-то свое. Тут снова управление возвращается к первому потоку, и он дописывает вторую половину нашей переменной...

Answer 2

В C++ атомарными операциями являются лишь операции над std::atomic, все остальные операции неатомарны.

При соблюдении определенных условий, на определённой архитектуре, атомарными могут быть операции и над «простыми» объектами, но стандартом C++ это не гарантируется. К примеру, есть у Вас такой код:

int64_t var{};
var = -1;

Если мы запустим его на 64-х битной архитектуре (amd64, к примеру) то наверняка операция var = -1 будет атомарной, т.к. шина позволяет записать за один раз все 64 бита, т.е. у нас будет один mov в ассемблере. Если же мы соберём этот код для 32-х битного процессора (x86, к примеру), то эта операция перестанет быть атомарной и наверняка будет состоять из двух последовательных mov, т.к. за одну неделимую операцию нельзя в 32-х битную шину засунуть 64 бита данных.

Правда, в процессорах есть достаточно средств, чтобы превращать несколько операций в одну атомарную, но эти средства будут как раз использоваться с std::atomic. Если же средств процессора для реализации std::atomic недостаточно, то выходят на более высокий уровень — блокировка мьютексов и прочее. С точки зрения процессора такие операции не могут считаться атомарными, но с точки зрения приложения они будут атомарны, т.к. ни в какой момент времени программа на сможет прочитать частично записанное значение.

Answer 3

Вообще, что атомарно, а что нет надо искать в описании компилятора, для конкретного процессора, например для некоторых DSP присвоение является атомарным, но обычно даже оно не атомарно, для надёжности лучше пользоваться чем то типа std::atomic

READ ALSO
Количество столкновений за 1 секунду для заданного количества точек С++ [требует правки]

Количество столкновений за 1 секунду для заданного количества точек С++ [требует правки]

HELPБез ООП Нужно определить количество столкновений за 1 секунду для заданного количества нульмерных шаров (точек) в одномерном пространстве,...

349
Sourse files.Двойное определение функций С++

Sourse files.Двойное определение функций С++

По заданию, мне нужно написать Sourse filecpp, и в него записать функции

336
массивы в WebAssembly

массивы в WebAssembly

Как передать массив строк (char [10][10]) из модуля C, оттранслированного в WebAssembly, в модуль javascript и обратно?

280