Ситуация с мертвой блокировкой в потоках?

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

5
задан Hariharbalaji 4 January 2010 в 06:50
поделиться

7 ответов

Тупик - это ситуация, когда параллельная программа не может продолжать работу.

Поток ждет другого нить, в то время как другая нить ожидающий первой нити Завершение.

Часто используемый реальный пример - поток трафика.

alt text

Ни один трафик не может двигаться, пока не сдвинется другая очередь.

Хорошую дискуссию о тупиках можно найти здесь.

Обновление : Это один java пример, который я нашел в web (Oreilly book). В ней есть комментарии на этот счет, чтобы вы могли легко это понять.

Dining Philosophers problem является еще одним хорошим примером для понимания дедлоков.

remove dead imageshack link

Dead lock detection and Deadlock prevention - две взаимосвязанные области, которые могут быть полезны при изучении дэдлоков

.
22
ответ дан 18 December 2019 в 05:36
поделиться

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

Одним из наиболее распространенных (и обычно используемых для иллюстрации) сценариев дедлока является инверсия замка:

  • Рассмотрим приложение, которое имеет два критических ресурса (resA, resB) и два замка (lockA, lockB). Каждый ресурс защищен соответствующим замком (resA => lockA, resB => lockB).
  • Два ресурса борются за ресурсы, Thread A резервирует lockA (и, следовательно, ресурс A), а затем приостанавливается для контекстного переключателя), прежде чем иметь возможность резервировать lockB. Поток B получает контроль, резервирует lockB и затем пытается резервировать lockA. Это приводит к приостановке потока и возврату контроля обратно в Потоке A, которая ждет lockB, а именно в Потоке B.

В этом сценарии вы имеете тупиковую ситуацию из-за циклической зависимости между двумя потоками от двух оспариваемых ресурсов (lockA и lockB), которая не может быть разрешена без отдельного вмешательства.

Это может быть тривиально разрешено любым из следующих способов:

  1. Обеспечение того, чтобы две блокировки были разрешены по порядку (не лучший выбор)
  2. Только удержание одной блокировки для каждой критической секции одновременно (т.е. снять блокировкуА перед попыткой получения блокировкиВ)
1
ответ дан 18 December 2019 в 05:36
поделиться

Тупик - это когда A ждет на B, а B ждет на A.

Так что можно было бы иметь в потоке A:

while(B.incomplete()){
    B.wait();
} A.complete = true;

и иметь в потоке B:

while(A.incomplete()){
    A.wait();
} B.complete = true;
6
ответ дан 18 December 2019 в 05:36
поделиться

Вот пример тупиковой ситуации, в которой не используется wait. Пока есть синхронизация, есть вероятность возникновения дедлока.

public class Deadlock {
  static class Deadlocker {
    private Deadlocker other;

    public void setOther(Deadlocker other) {
      this.other = other;
    }

    synchronized void doSomethingWithOther() {
      try {
        Thread.sleep(1);
      } catch (InterruptedException e) {
      }
      other.doSomething();
    }

    synchronized void doSomething() {
    }
  }

  public static void main(String[] args) {
    final Deadlocker d1 = new Deadlocker();
    final Deadlocker d2 = new Deadlocker();
    d1.setOther(d2);
    d2.setOther(d1);

    Thread t1 = new Thread() {
      public void run() {
        d1.doSomethingWithOther();
      }
    };

    Thread t2 = new Thread() {
      public void run() {
        d2.doSomethingWithOther();
      }
    };

    t1.start();
    t2.start();
  }
}

Тупик возникает, когда t1 находится в d1. doSomethingWithOther() (и, следовательно, имеет блокировку на d1) и t2 находится в d2.doSomethingWithOther() (и, следовательно, имеет блокировку на d2). Когда каждый поток пытается вызвать doSomething() на объекте, на котором находится блокировка другой поток , они застревают, ожидая друг друга.

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

.
2
ответ дан 18 December 2019 в 05:36
поделиться

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

.
0
ответ дан 18 December 2019 в 05:36
поделиться
[

] Представьте себе следующие логические потоки. [

] [
    ] [
  1. ] [

    ] В уловке-22, роман, пилот истребителя должен был быть посажен на землю из-за безумия. Он мог доказать, что он не сумасшедший, чтобы снова летать. Но, попросив, желая полететь в бой, чтобы подвергнуть свою жизнь опасности, он продемонстрировал бы, что он сумасшедший.[

    ][
  2. ]. [
  3. ] [

    ] Северная Корея хочет, чтобы "Большая семерка" предоставила экономическую помощь до остановки переработки урана. США и Япония говорят: "Нет пути, потому что они откажутся от помощи"[

    ][
  4. ]. [
  5. ] [

    ] Конфликт перезагрузки системы. [

    ] [
      ] [
    1. ] Система не отключалась до тех пор. все пользовательские процессы были прекращено.[
    2. ] [
    3. ] Редактор, пользовательский процесс не стал бы заканчивается, если только редактирование не было спасен.[
    4. ] [
    5. ] Редактирование не может быть сохранено, если только USB-накопитель присутствует, потому что исполняемый файл редактора был вызван из USB-накопитель.[
    6. ] [
    7. ] USB-накопитель был демонтирован, потому что обновления водителя. USB-накопитель не мог быть установлен до тех пор, пока система отключена и перезагружена. [
    8. ] [
    ][
  6. ] [
  7. ] [

    ] Робот Андроид имеет основные директивы [

    ] [

    ] Робот не может причинить вред человеку или, в результате бездействия, позволить человеку причинить вред. [

    ] [

    ] Робот должен подчиняться любым приказам, отданным ему людьми, за исключением случаев, когда такие приказы противоречат Первой директиве.[

    ] [

    ] Робот должен защищать свое собственное существование до тех пор, пока такая защита не противоречит Первой или Второй директиве.[

    ][
  8. ]. [
] [

] Человек, находившийся на базе, послал робота для извлечения радиоактивного источника энергии. Без этого источника питания база закрылась бы, а человеческая колония погибла бы. Но робот обнаруживает, что источник питания настолько мощный и неэкранированный, работа с ним привела бы к неисправности робота и стала бы опасной для человеческой колонии [

].
1
ответ дан 18 December 2019 в 05:36
поделиться
..

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

A хорошая статья Стивена Тауба может немного помочь вам.

0
ответ дан 18 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

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