@floppapa

Как обойти все исполнения программы?

В стандарте C++ говорится, что наличие гонки данных при исполнении программы означает неопределённое поведение.
Поэтому необходимо писать программы так, чтобы ни в одном из возможных исполнений не могло быть гонки данных.

Но как найти (хотя бы просто обойти) все возможные исполнения C++ программы для заданных входных данных?
Существует ли для этого какой-нибудь алгоритм?

Я как-то даже придумать ничего не могу.
Главная проблема - это то, что чтение может возвращать значение записи в эту же переменную, выполненную в другом потоке в далёком будущем.
Иначе говоря, когда мы глядим на чтение какой-то переменной и пытаемся понять, какое значение может быть прочитано, то мы не можем этого сделать, потому что не знаем, какие записи в эту переменную могут произойти в других потоках в будущем.
Более того, то, какие записи произойдут в других потоках в будущем, легко может зависеть от того, какое значение возвратит текущее чтение, - в итоге получается какой-то замкнутый круг.
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 4
mayton2019
@mayton2019
Bigdata Engineer
Посмотри ключик
-fsanitize=thread

и еще посмотри PVS Studio. Вроде у них был статический анализ таких ситуаций но я точно не уверен.
Надо искать инфу.
Ответ написан
maaGames
@maaGames
Погроммирую программы
Мьютексы, семафоры, критические секции. То есть добавь объекты синхронизации, чтобы гарантировать, что объекты изменяются упорядоченно и только одним потоком в единицу времени.
Ответ написан
Nipheris
@Nipheris Куратор тега C++
т.е. чтобы готовая программа гарантировано была без гонок данных.

для этого лучше использовать язык программирования с отсутствием гонок данных, например Rust (без unsafe).
А так то что вы хотите от C++ - это к сожалению аналог проблемы останова.

Поэтому необходимо писать программы так, чтобы ни в одном из возможных исполнений не могло быть гонки данных.

Вот именно, что нужно программы ПИСАТЬ так, чтобы не было гонок, а не пытаться проверять непонятно как написанное.
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Если хочешь упороться, то можно заюзать формальные верификаторы.
Например, SPIN.

Он использует свой язык, поэтому придется дублировать логику.
На так можно удостовериться в корректности.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы