Ответ 1
Не все гонки одинаково плохи.
Худший вид гонки, который вы можете получить, это чтение частичных результатов. Вот что Herb Sutter упоминал как "видящих розовых слонов": ваша программа может наблюдать промежуточное состояние, которое нарушает все инварианты.
Типичным примером здесь являются одновременные неатомные записи. Если один поток читается из переменной, которая одновременно написана другим потоком, читатель может получить полный мусор. Мало того, что вы не можете сказать, увидит ли читатель старое значение или новое значение, он может фактически увидеть значение, которое никогда не было написано кем-либо. Необходимо избегать таких видов расхождений данных во что бы то ни стало, так как практически невозможно рассуждать о наблюдаемых значениях каким-либо образом. Например, С++ отправляет вас прямо в undefined -беспочну-землю.
Менее критический вид расы - это когда все обращения к данным являются атомарными, поэтому вы знаете, что читатели будут наблюдать только полностью записанные значения, но порядок не указан. Таким образом, вы не знаете, действительно ли значение, которое вы прочитали, является самым новым или два значения, которые вы читали вместе, фактически были в памяти одновременно. Часто бывает полезно принять это по соображениям производительности. Важным примером здесь являются распределенные приложения: Синхронизация данных по сети происходит особенно медленно, поэтому часто принято считать, что определенные узлы могут иметь устаревшее представление о мире, но все же способны выполнять работу на основе этого состояния. Подумайте о кеше поисковой системы: лучше дать быстрый результат, основанный на вчерашнем кеше, чем дать медленный результат или никакого результата вообще.
Аналогичные примеры встречаются в нераспространенных средах. Рассмотрим бесплатную очередь: обычно вам не нужен точный порядок, в котором элементы попадают в очередь. Все продюсерская гонка "вставляет предметы в обратную очередь очереди и аналогично всем гонкам потребителей", чтобы потреблять передний элемент очереди. Однако, пока вы можете гарантировать, что никакие предметы не будут случайно потеряны или повреждены, этот пониженный уровень контроля будет приемлемым.