2013-12-11 3 views
10

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

EDIT: Параллелизм и очереди - хороший пример намеренного не заботиться о заказе вещей, если ничего не потеряно. Любые идеи о том, как «действительно волосатые низкоуровневые алгоритмы делают это нарочно»?

+0

На момент запроса у меня недостаточно репутации, чтобы прокомментировать упомянутый ответ. Прокомментировал сейчас. Может быть, автор заметит. –

+0

Я думаю, его точка зрения заключается не в том, что условие гонки полезно, а скорее, что оно не катастрофическое. –

+3

«Умышленное состояние гонки» в Google, дает некоторые ссылки, которые кажутся релевантными. –

ответ

2

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

+1

Я не думаю, что фраза «условие гонки» относится к этому. Достижение вывода из двух путей не создает конфликтный сценарий, а условие или сценарий принятия решения. Тем не менее, спасибо за введение этого блога. Интересное чтение. – Xephon

+0

@AlexV. Подробная информация о сценарии ??? – Xephon

+0

@Xephon, я склонен согласиться, но писатель явно не так, поэтому стоит обсудить. – Leeor

6

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

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

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

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

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

Смежные вопросы