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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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