В стандарте C++
говорится, что наличие гонки данных при исполнении программы означает неопределённое поведение.
Поэтому необходимо писать программы так, чтобы ни в одном из возможных исполнений не могло быть гонки данных.
Но как найти (хотя бы просто обойти) все возможные исполнения C++ программы для заданных входных данных?
Существует ли для этого какой-нибудь алгоритм?
Я как-то даже придумать ничего не могу.
Главная проблема - это то, что чтение может возвращать значение записи в эту же переменную, выполненную в другом потоке в далёком будущем.
Иначе говоря, когда мы глядим на чтение какой-то переменной и пытаемся понять, какое значение может быть прочитано, то мы не можем этого сделать, потому что не знаем, какие записи в эту переменную могут произойти в других потоках в будущем.
Более того, то, какие записи произойдут в других потоках в будущем, легко может зависеть от того, какое значение возвратит текущее чтение, - в итоге получается какой-то замкнутый круг.