Что такое тупик?

Я знаю его старый, но могу помочь кому-то. Вы можете загрузить файл из потока и отпустить его. Это сработало для меня. Я нашел решение ЗДЕСЬ .

Надеюсь, что это поможет.

139
задан Levent Divilioglu 26 February 2016 в 00:09
поделиться

6 ответов

блокировка происходит, когда несколько процессов пытаются получить доступ к тому же ресурсу одновременно.

Один процесс терпит неудачу и должен ожидать другого для окончания.

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

Так, пример:

Ресурс A и ресурс B используются процессом X и обрабатывают Y

  • X, начинает использовать A.
  • X и Y пытаются начать использовать B
  • Y 'победы', и добирается, B сначала
  • теперь Y должен использовать
  • , А заблокирован X, который ожидает Y

лучший способ избежать, чтобы мертвые блокировки постарались не иметь процессы, пересекают таким образом. Уменьшите потребность заблокировать что-либо так, как Вы можете.

базы данных In стараются не вносить много изменений в различных таблицах в единственной транзакции, избегают триггеров и переключаются на чтения optimistic/dirty/nolock как можно больше.

183
ответ дан Keith 26 February 2016 в 00:09
поделиться
  • 1
    Или можно назвать @Html. Действие (...) вместо этого, для вызова его как метода, который возвращает содержание (если Вы don' t как использование фигурных скобок, и т.д.) – James Nail 11 February 2011 в 00:33

Мертвая блокировка происходит, когда поток ожидает чего-то, что никогда не происходит.

Как правило, это происходит, когда поток ожидает на взаимном исключении или семафоре, который никогда не выпускался предыдущим владельцем.

Это также часто происходит, когда у Вас есть ситуация, включающая два потока и две блокировки как это:

Thread 1               Thread 2

Lock1->Lock();         Lock2->Lock();
WaitForLock2();        WaitForLock1();   <-- Oops!

Вы обычно обнаруживаете их, потому что вещи, что Вы ожидаете происходить, никогда не делают, или приложение зависает полностью.

7
ответ дан 17 of 26 26 February 2016 в 00:09
поделиться
  • 1
    Вы don' t видят Seq.bind потому что it' s не функция в Seq модуль; это - метод разработчика рабочего процесса, лежащего в основе seq моноид. – pblasucci 5 January 2011 в 01:59

Мертвая блокировка является состоянием системы, в которой никакой единственный процесс/поток не способен к выполнению действия. Как упомянуто другими, мертвая блокировка обычно является результатом ситуации, где каждый процесс/поток хочет получить блокировку к ресурсу, который уже заблокирован другим (или даже то же) процесс/поток.

существуют различные методы, чтобы найти их и избежать их. Каждый думает очень трудно и/или пробует много вещей. Однако контакт с параллелизмом является известно трудным и большинство (если не все), люди не будут в состоянии полностью избежать проблем.

Некоторые более формальные методы могут быть полезными, если Вы серьезно относитесь к контакту с этими видами проблем. Самый практический метод, о котором я знаю, должен использовать процесс теоретический подход. Здесь Вы моделируете свою систему на некотором языке процесса (например, CCS, CSP, ACP, mCRL2, LOTOS) и используете доступные инструменты для (модель-) проверка на мертвые блокировки (и возможно некоторые другие свойства также). Примерами комплекта инструментальных средств для использования является ФРГ, mCRL2, CADP и Uppaal. Некоторые храбрые души могли бы даже доказать свою системную мертвую блокировку, бесплатную при помощи чисто символьных методов (доказательство теорем; ищите Owicki-Gries).

Однако эти формальные методы обычно требуют некоторого усилия (например, изучение основ теории процесса). Но я предполагаю, что это - просто последствие того, что эти проблемы трудны.

0
ответ дан mweerden 26 February 2016 в 00:09
поделиться
  • 1
    Это показывает, как можно сделать это. Это именно так происходит что Вы can' t делают это способ, которым спросил вопрос. – MSN 18 May 2010 в 23:41

Мертвая блокировка происходит, когда два потока aquire блокировки, которые препятствуют тому, чтобы любой из них прогрессировал. Лучший способ избежать их с тщательной разработкой. Много встроенных систем защищают от них при помощи сторожевого таймера (таймер, который сбрасывает систему каждый раз, когда, если она зависает в течение определенного периода времени).

2
ответ дан Joseph Sturtevant 26 February 2016 в 00:09
поделиться

Мертвые блокировки только произойдут, когда у Вас будет две или больше блокировки, которые могут быть aquired одновременно, и они захватываются в различном порядке.

Способы постараться не иметь мертвые блокировки:

  • стараются не иметь блокировки (если возможный),
  • стараются не иметь больше чем одну блокировку
  • , всегда берут блокировки в том же порядке.
34
ответ дан Mats Fredriksson 26 February 2016 в 00:09
поделиться
  • 1
    Это похоже немного более обязательный, чем декларативный SelectMany – Tuomas Hietanen 5 January 2011 в 11:25

Основанное на блокировке управление совместным выполнением

Используя блокировку для управления доступом к совместно используемым ресурсам подвержено мертвым блокировкам, и один только планировщик транзакции не может предотвратить их случаи.

, Например, системы реляционных баз данных используют различные блокировки для гарантии транзакции свойства .

ACID

, Какую систему реляционных баз данных Вы используете, блокировки будут всегда получаться при изменении (например, UPDATE или DELETE) определенной записи таблицы. Не блокируя строку, которая была изменена в настоящее время рабочей транзакцией, , Атомарность будет поставлена под угрозу .

, Что является мертвой блокировкой

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

enter image description here

, поскольку обе транзакции находятся в фазе приобретения блокировки, никакая не выпускает блокировку до получения следующего.

Восстановление с ситуации с мертвой блокировкой

при использовании алгоритма Управления совместным выполнением, который полагается на блокировки, затем всегда существует риск выполнения в ситуации с мертвой блокировкой. Мертвые блокировки могут произойти в любой среде параллелизма, не только в системе баз данных.

, Например, программа многопоточности может зайти в тупик, если два или больше потока ожидают на блокировках, которые были ранее получены так, чтобы никакой поток не мог сделать успехи. Если это происходит в JAVA-приложении, JVM не может только вынудить Поток остановить свое выполнение и выпустить его блокировки.

, Даже если Thread класс выставляет stop метод, тот метод был удержан от использования начиная с Java 1.1, потому что он может заставить объекты быть оставленными в непоследовательном состоянии после того, как поток останавливается. Вместо этого Java определяет interrupt метод, который действует как подсказка как поток, который прерван, может просто проигнорировать прерывание и продолжить его выполнение.

поэтому JAVA-приложение не может восстановиться с ситуации с мертвой блокировкой, и это - обязанность разработчика приложений заказать запросы приобретения блокировки таким способом, которым никогда не могут происходить мертвые блокировки.

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

механизм базы данных выполняет отдельный процесс, который сканирует текущий график конфликта для циклов ожидания блокировка (которые вызываются мертвыми блокировками). Когда цикл обнаруживается, механизм базы данных выбирает одну транзакцию и прерывает ее, заставляя ее блокировки быть выпущенным, так, чтобы другая транзакция могла сделать успехи.

В отличие от JVM, транзакция базы данных разработана как атомарная единица работы. Следовательно, откат оставляет базу данных в согласованном состоянии.

для получения дополнительной информации об этой теме, проверьте эта статья также.

0
ответ дан 23 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: