Я знаю его старый, но могу помочь кому-то. Вы можете загрузить файл из потока и отпустить его. Это сработало для меня. Я нашел решение ЗДЕСЬ .
Надеюсь, что это поможет.
блокировка происходит, когда несколько процессов пытаются получить доступ к тому же ресурсу одновременно.
Один процесс терпит неудачу и должен ожидать другого для окончания.
А мертвая блокировка происходит, когда ожидающий процесс все еще держится за другой ресурс, что первые потребности, прежде чем это сможет закончиться.
Так, пример:
Ресурс A и ресурс B используются процессом X и обрабатывают Y
лучший способ избежать, чтобы мертвые блокировки постарались не иметь процессы, пересекают таким образом. Уменьшите потребность заблокировать что-либо так, как Вы можете.
базы данных In стараются не вносить много изменений в различных таблицах в единственной транзакции, избегают триггеров и переключаются на чтения optimistic/dirty/nolock как можно больше.
Мертвая блокировка происходит, когда поток ожидает чего-то, что никогда не происходит.
Как правило, это происходит, когда поток ожидает на взаимном исключении или семафоре, который никогда не выпускался предыдущим владельцем.
Это также часто происходит, когда у Вас есть ситуация, включающая два потока и две блокировки как это:
Thread 1 Thread 2
Lock1->Lock(); Lock2->Lock();
WaitForLock2(); WaitForLock1(); <-- Oops!
Вы обычно обнаруживаете их, потому что вещи, что Вы ожидаете происходить, никогда не делают, или приложение зависает полностью.
Seq.bind
потому что it' s не функция в Seq
модуль; это - метод разработчика рабочего процесса, лежащего в основе seq
моноид.
– pblasucci
5 January 2011 в 01:59
Мертвая блокировка является состоянием системы, в которой никакой единственный процесс/поток не способен к выполнению действия. Как упомянуто другими, мертвая блокировка обычно является результатом ситуации, где каждый процесс/поток хочет получить блокировку к ресурсу, который уже заблокирован другим (или даже то же) процесс/поток.
существуют различные методы, чтобы найти их и избежать их. Каждый думает очень трудно и/или пробует много вещей. Однако контакт с параллелизмом является известно трудным и большинство (если не все), люди не будут в состоянии полностью избежать проблем.
Некоторые более формальные методы могут быть полезными, если Вы серьезно относитесь к контакту с этими видами проблем. Самый практический метод, о котором я знаю, должен использовать процесс теоретический подход. Здесь Вы моделируете свою систему на некотором языке процесса (например, CCS, CSP, ACP, mCRL2, LOTOS) и используете доступные инструменты для (модель-) проверка на мертвые блокировки (и возможно некоторые другие свойства также). Примерами комплекта инструментальных средств для использования является ФРГ, mCRL2, CADP и Uppaal. Некоторые храбрые души могли бы даже доказать свою системную мертвую блокировку, бесплатную при помощи чисто символьных методов (доказательство теорем; ищите Owicki-Gries).
Однако эти формальные методы обычно требуют некоторого усилия (например, изучение основ теории процесса). Но я предполагаю, что это - просто последствие того, что эти проблемы трудны.
Мертвая блокировка происходит, когда два потока aquire блокировки, которые препятствуют тому, чтобы любой из них прогрессировал. Лучший способ избежать их с тщательной разработкой. Много встроенных систем защищают от них при помощи сторожевого таймера (таймер, который сбрасывает систему каждый раз, когда, если она зависает в течение определенного периода времени).
Мертвые блокировки только произойдут, когда у Вас будет две или больше блокировки, которые могут быть aquired одновременно, и они захватываются в различном порядке.
Способы постараться не иметь мертвые блокировки:
Используя блокировку для управления доступом к совместно используемым ресурсам подвержено мертвым блокировкам, и один только планировщик транзакции не может предотвратить их случаи.
, Например, системы реляционных баз данных используют различные блокировки для гарантии транзакции свойства .
ACID, Какую систему реляционных баз данных Вы используете, блокировки будут всегда получаться при изменении (например, UPDATE
или DELETE
) определенной записи таблицы. Не блокируя строку, которая была изменена в настоящее время рабочей транзакцией, , Атомарность будет поставлена под угрозу .
, Поскольку я объяснил в эта статья , мертвая блокировка происходит, когда две параллельных транзакции не могут сделать успехи, потому что каждый ожидает другого для выпуска блокировки, как проиллюстрировано в следующей схеме.
, поскольку обе транзакции находятся в фазе приобретения блокировки, никакая не выпускает блокировку до получения следующего.
при использовании алгоритма Управления совместным выполнением, который полагается на блокировки, затем всегда существует риск выполнения в ситуации с мертвой блокировкой. Мертвые блокировки могут произойти в любой среде параллелизма, не только в системе баз данных.
, Например, программа многопоточности может зайти в тупик, если два или больше потока ожидают на блокировках, которые были ранее получены так, чтобы никакой поток не мог сделать успехи. Если это происходит в JAVA-приложении, JVM не может только вынудить Поток остановить свое выполнение и выпустить его блокировки.
, Даже если Thread
класс выставляет stop
метод, тот метод был удержан от использования начиная с Java 1.1, потому что он может заставить объекты быть оставленными в непоследовательном состоянии после того, как поток останавливается. Вместо этого Java определяет interrupt
метод, который действует как подсказка как поток, который прерван, может просто проигнорировать прерывание и продолжить его выполнение.
поэтому JAVA-приложение не может восстановиться с ситуации с мертвой блокировкой, и это - обязанность разработчика приложений заказать запросы приобретения блокировки таким способом, которым никогда не могут происходить мертвые блокировки.
Однако система баз данных не может осуществить данное распоряжение приобретения блокировки, так как невозможно предвидеть то, что другие блокировки определенная транзакция захочет получить далее. Сохранение порядка блокировки становится ответственностью уровня доступа к данным, и база данных может только помочь в восстановлении с ситуации с мертвой блокировкой.
механизм базы данных выполняет отдельный процесс, который сканирует текущий график конфликта для циклов ожидания блокировка (которые вызываются мертвыми блокировками). Когда цикл обнаруживается, механизм базы данных выбирает одну транзакцию и прерывает ее, заставляя ее блокировки быть выпущенным, так, чтобы другая транзакция могла сделать успехи.
В отличие от JVM, транзакция базы данных разработана как атомарная единица работы. Следовательно, откат оставляет базу данных в согласованном состоянии.
для получения дополнительной информации об этой теме, проверьте эта статья также.