Здравствуйте, vdimas, Вы писали:
V>>>·>Да. И ведёт к undefined behaviour.
V>>>Докажи.
V>·>If a data race occurs, the behavior of the program is undefined.
V>Вот как здесь — общий случай, который не относится к частному.
V>Требовалось доказать, что для атомарных операций чтения/записи это тоже верно.
Атомарные операции определены только над атомарными типами. Список атомарных типов приводится явно. Атомарные типы гарантируют отсутствие data race. Это я уже тоже многократно цитировал.
V>·>(с) https://www.modernescpp.com/index.php/race-condition-versus-data-race
V>Учу читать по твоей ссылке, дорого:
V>V>Race condition:
V>A race condition is a situation, in which the result of an operation depends on the interleaving of certain individual operations.
V>Data race:
V>A data race is a situation, in which at least two threads access a shared variable at the same time. At least on thread tries to modify the variable.
V>Вопросы?
Ты читай до конца и не цитируй фигурно. Ты заявил "data race может быть причиной race condition." с этим я и спорил. На самом деле ровно наоборот:
A race condition can be the reason for a data race
V>>>>>Но может быть и частью алгоритма.
V>>>·>Data race не может быть частью корректного алгоритма, т.к. является undefined behaiour и никакие характеристики алгоритма обеспечить не может.
V>>>Докажи.
V>·>If a data race occurs, the behavior of the program is undefined.
V>·>(с) https://en.cppreference.com/w/cpp/language/memory_model
V>Докажи верность этого утверждения для атомарно изменяемых переменных.
Я не знаю что такое ты имеешь конкретно "атомарно изменяемых переменных". Есть типы, объекты у которых есть атомарные операции. Эти типы — std::atomic или _Atomic.
Стандарт говорит: A program that has two conflicting evaluations has a data race unless ... both conflicting evaluations are atomic operations (see std::atomic)"
Следовательно, std::atomic не создают data race. И следовательно их поведение не является undefined.
V>·>Доказывать твои фантазии? Упаси боже. Ты глупость сказал, ты и доказывай.
V>Глупости тут говоришь ты.
V>А моей целью было заставить тебя начать думать.
V>Начал бы ты думать и обнаружил бы, что для атомарных типов мьютекс в std::atomic не нужен не спроста.
Разберись что такое is_lock_free. Если есть вопросы, задавай, вместо того чтобы в очередной раз писать некорректное утверждение.
V>И при этом гарантируется отсутствие гонок.
Отсутствие гонок гарантируется для всех std::atomic.
Да, я ещё забыл о std::atomic_flag, в котором по дизайну нет мьютекса и который гарантирует отсутствие data race.
V>При том что достоверно известно, что одновременные чтения и запись в переменную идут.
V>Т.е. прямо согласно определению, это data race.
V>Или не совсем?
описание data race явно упоминает atomic-типы: "data race unless ... atomic".
V>>>Я хочу сказать, что такой код всегда корректный.
V>·>Это твои фантазии.
V>Доказать не в состоянии.
V>Слился.
Я знаю, что ты хочешь сказать. Ты много что болтаешь. Ты это должен доказывать свои высказывания или идти лесом. Доказывать твои фантазии я не собираюсь.
V>·>(с) https://en.cppreference.com/w/c/language/atomic
V>Сравни:
V>they may be modified by two threads concurrently or modified by one and read by another.
V>...
V>A data race is a situation, in which at least two threads access a shared variable at the same time. At least on thread tries to modify the variable.
А слова чуть раньше ты конечно обрезал: "Objects of atomic types are the only objects that are
free from data races".
Если ты ещё раз будешь такие фокусы выкидывать, я просто прекращу общение. Это тупо неуважение к собеседнику.
V>Ты уже сравнил определения выше.
V>В чём отличия?
В том что ты внаглую режешь предложения на кусочки. Классическое "Было бы ошибкой думать. В.И.Ленин."
V>Да, и этого достаточно.
V>Но тред не просто так прерывает своё исполнение, а в очень важный для абстрактной машины состояния процессора момент.
V>В какой именно момент, ы?
Это дело операционки, а не яп. Мы обсуждаем яп.