Существует важное техническое различие между условиями гонки и гонкой данных. В большинстве ответов предполагается, что эти термины эквивалентны, но это не так.
Гонка данных происходит, когда 2 инструкции обращаются к одному и тому же участку памяти, по крайней мере один из этих обращений является записью, и среди этих обращений не происходит выполнения до упорядочения. Теперь то, что составляет «происходит до упорядочивания», является предметом множества споров, но в целом пары «блокировка-блокировка» для одной и той же переменной блокировки и пары «ожидание-сигнал» для одной и той же переменной условия вызывают порядок «происходит раньше».
Состояние гонки - это семантическая ошибка. Это ошибка, возникающая во времени или порядке событий, которая приводит к ошибочному поведению программы.
Многие состояния гонки могут быть (и фактически являются) вызваны гонкой данных, но это не обязательно. Фактически, гонки данных и условия гонки не являются ни необходимым, ни достаточным условием друг для друга. Это сообщение блога также очень хорошо объясняет разницу на простом примере банковской транзакции. Вот еще один простой пример, объясняющий разницу.
Теперь, когда мы определились с терминологией, давайте попробуем ответить на исходный вопрос.
Учитывая, что условия гонки являются семантическими ошибками, не существует общего способа их обнаружения. Это потому, что не существует автоматического оракула, который мог бы отличить правильное поведение программы от неправильного в общем случае. Обнаружение расы - неразрешимая проблема.
С другой стороны, гонки данных имеют точное определение, которое не обязательно связано с правильностью, и поэтому их можно обнаружить. Существует множество разновидностей детекторов гонки данных (статическое / динамическое обнаружение гонки данных, обнаружение гонки данных на основе набора блокировок, обнаружение гонки данных на основе «происходит раньше», обнаружение гибридной гонки данных). Современным детектором динамической гонки данных является ThreadSanitizer, который работает очень хорошо на практике.
Обработка гонок данных в целом требует определенной программной дисциплины, чтобы вызвать границы «происходит раньше» между доступами к общим данным (либо во время разработки, либо после их обнаружения с помощью вышеупомянутых инструментов). это можно сделать с помощью блокировок, переменных состояния, семафоров и т. д. Однако можно также использовать другие парадигмы программирования, такие как передача сообщений (вместо общей памяти), которые позволяют избежать гонки данных по построению.
person
Baris Kasikci
schedule
29.08.2013