Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

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

#cpp #терминология #атомарность


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


Ответы

Ответ 1



Грубо - которые могут оказаться прерванными другим потоком. Примеры? Ну, например if (a) { f(a); } Пока вы считали a, которое равно true, и собрались выполнять f(a), другой поток уже сделал a равным false :) Или даже такая экзотика - в одном потоке вы присваиваете значение переменной из двух слов. Первое слово записалось, прерывание, другой поток читает из памяти нечто полузаписанное. Работает, записывает что-то свое. Тут снова управление возвращается к первому потоку, и он дописывает вторую половину нашей переменной...

Ответ 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 недостаточно, то выходят на более высокий уровень — блокировка мьютексов и прочее. С точки зрения процессора такие операции не могут считаться атомарными, но с точки зрения приложения они будут атомарны, т.к. ни в какой момент времени программа на сможет прочитать частично записанное значение.

Ответ 3



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

Комментариев нет:

Отправить комментарий