Что такое тупик? - PullRequest
       108

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

131 голосов
/ 29 августа 2008

При написании многопоточных приложений одной из наиболее распространенных проблем являются взаимоблокировки.

Мои вопросы к сообществу:

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

  2. Как вы их обнаруживаете?

  3. Вы справляетесь с ними?

  4. И, наконец, как вы предотвращаете их появление?

Ответы [ 16 ]

0 голосов
/ 22 августа 2018

Классическая и очень простая программа для понимания тупик ситуация: -

public class Lazy {

    private static boolean initialized = false;

    static {
        Thread t = new Thread(new Runnable() {
            public void run() {
                initialized = true;
            }
        });

        t.start();

        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println(initialized);
    }
}

Когда основной поток вызывает Lazy.main, он проверяет, является ли класс Lazy был инициализирован и начинает инициализировать класс. основной поток теперь устанавливает инициализированное значение false, создает и запускает фон поток, метод запуска которого устанавливает значение initialized в значение true и ожидает завершения фонового потока.

На этот раз класс в настоящее время инициализируется другим потоком. В этих условиях текущий поток, который является фоновым потоком, ожидает объекта Class до завершения инициализации. К сожалению, поток который выполняет инициализацию, основной поток ожидает фон нить для завершения. Поскольку два потока теперь ждут друг друга, Программа ОТКЛЮЧЕНА.

0 голосов
/ 25 апреля 2018

Deadlock возникает, когда поток ожидает завершения другого потока, и наоборот.

Как избежать?
- Избегайте вложенных замков
- Избегайте ненужных замков
- Использовать нить join ()

Как вы это обнаружили?
запустите эту команду в cmd:

jcmd $PID Thread.print

ссылка : geeksforgeeks

0 голосов
/ 15 апреля 2017

Выше некоторые объяснения хороши. Надеюсь, что это также может быть полезно: https://ora -data.blogspot.in / 2017/04 / тупиковый-в-oracle.html

В базе данных, когда сеанс (например, ora) хочет ресурс, удерживаемый другим сеансом (например, данные), но этот сеанс (данные) также хочет ресурс, который удерживается первым сеансом (ora). Также может быть задействовано более двух сессий, но идея будет одинаковой. Фактически, тупики не позволяют некоторым транзакциям продолжать работать. Например: Предположим, ORA-DATA удерживает блокировку A и запрашивает блокировку B И SKU держит блокировку B и запрашивает блокировку A.

Спасибо

0 голосов
/ 19 апреля 2015

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

0 голосов
/ 08 ноября 2013

Mutex по сути является замком, обеспечивающим защищенный доступ к общим ресурсам. В Linux тип данных мьютекса потока - pthread_mutex_t. Перед использованием инициализируйте его.

Чтобы получить доступ к общим ресурсам, вам нужно заблокировать мьютекс. Если мьютекс уже заблокирован, вызов заблокирует поток, пока мьютекс не будет разблокирован. По завершении посещения общих ресурсов их необходимо разблокировать.

В целом, существует несколько неписаных основных принципов:

  • Получите блокировку перед использованием общих ресурсов.

  • Удерживание замка как можно более короткое время.

  • Снять блокировку, если поток возвращает ошибку.

0 голосов
/ 03 сентября 2008

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

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

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

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

...