Защищены ли атомные объекты от расы?
Насколько я знаю, это не так.
Атомные объекты свободны от гонок данных, но они все еще могут страдать от гонок: два потока могут начинаться в непредсказуемом порядке, что делает результат программы недетерминированным.
Совместно используемые данные были бы "безопасными" (защищенными атомарными данными), но последовательность или временные характеристики все равно могли бы быть неправильными.
Вы можете это подтвердить?
2 ответа
Да, вы правы, что неатомарные операции могут все еще иметь состояние гонки. Если у вас есть неатомарные операции, которые зависят от состояния атомарного объекта без вмешательства со стороны других потоков, вам необходимо использовать другой метод синхронизации для поддержания согласованности.
Атомные операции над атомным объектом будут последовательными, но не свободными от гонки. Неатомарные операции с использованием атомарного объекта не свободны от гонки.
Не только атомарные объекты, любые примитивы, которые могут использоваться с операциями, выполняемыми одновременно выполняемыми потоками:
- мьютекс
- переменная условия
- семафор
- барьер
- атомные объекты...
по определению полезны только при наличии расы, непредсказуемости в схеме доступа. Если доступ был упорядочен предсказуемым образом, вы бы использовали обычный изменяемый объект в языке программирования.
Но даже если порядок априори неизвестен, конечный результат может быть детерминированным: рассмотрим параллельно работающие потоки, обслуживающие страницы для статического веб-сервера, причем количество страниц и байтов служит единственной изменяемой структурой данных. Статистику можно хранить в структуре данных, защищенной мьютексом (мьютекс не нужен, это просто простой пример): порядок блокировки мьютекса непредсказуем, но в результате структура данных содержит сумму страниц. и байты обслуживаются; не имеет значения, в каком порядке каждый поток добавляет количество к совместно используемым данным.