Чем могут быть полезны условия гонки?

Один из ответов на вопрос о том, в каких условиях гонки упоминаются низкоуровневые алгоритмы, сознательно использует условия гонки. Как условия гонки могут быть полезными?

РЕДАКТИРОВАТЬ: параллелизм и очереди являются хорошим примером преднамеренного не заботиться о порядке вещей, пока ничего не потеряно. Любые идеи о том, как "действительно волосатые низкоуровневые алгоритмы делают это нарочно"?

2 ответа

Не все гонки одинаково плохи.

Худшая гонка, которую вы можете получить - это чтение частичных результатов. Это то, что Херб Саттер назвал "видеть розовых слонов": ваша программа может наблюдать промежуточное состояние, которое нарушает все инварианты.

Типичным примером здесь являются одновременные неатомарные записи. Если один поток читает из переменной, которая одновременно записывается другим потоком, читатель может получить полный мусор. Мало того, что вы не можете сказать, увидит ли читатель старое значение или новое значение, оно может фактически увидеть значение, которое никто никогда не записывал. Такого рода гонок данных следует избегать любой ценой, поскольку практически невозможно рассуждать о наблюдаемых значениях каким-либо образом. C++, например, отправляет вас прямо на undefined-поведение-land в этом случае.

Менее критичный тип гонки - это когда все обращения к данным являются атомарными, поэтому вы знаете, что читатели будут когда-либо наблюдать только полностью записанные значения, но порядок не указан. Таким образом, вы не знаете, является ли значение, которое вы прочитали, на самом деле самым новым, или два значения, которые вы прочитали вместе, действительно находились в памяти одновременно. Часто полезно принять это по соображениям производительности. Ярким примером здесь являются распределенные приложения: синхронизация данных по сети происходит особенно медленно, поэтому часто считается, что некоторые узлы могут иметь устаревшее представление о мире, но все еще могут выполнять работу на основе этого состояния. Подумайте о кеше поисковой машины: лучше дать быстрый результат на основе вчерашнего кеша, чем медленный или вообще без результата.

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

Один из таких случаев (по крайней мере, его можно рассматривать как условие гонки, хотя это может быть спорным, если термин здесь держится), - это когда потоки конкурируют за нахождение какого-либо решения несколькими способами, и первое, что можно получить, может закончиться весь алгоритм. см., например, - http://parasail-programming-language.blogspot.co.il/2010/06/intentional-race-condition-in-parasail.html

Другие вопросы по тегам