Доказательство правильности алгоритмов мультипотока

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
11
задан Leandro 17 September 2008 в 22:54
поделиться

6 ответов

Невозможно доказать что-либо, не полагаясь на гарантии, таким образом, первая вещь, которую Вы хотите сделать, состоит в том, чтобы познакомиться с моделью памяти Вашей целевой платформы; Java и x86 и имеют твердые и стандартизированные модели памяти - я не так уверен в CLR, но если все остальное перестанет работать, то Вы будете иметь, полагаются на модель памяти Вашей целевой архитектуры ЦП. Исключение к этому правилу - то, если Вы намереваетесь использовать язык, который делает не позволяет общего изменяемого состояния вообще - я услышал, что Erlang похож на это.

Первая проблема параллелизма совместно используется изменяемое состояние.

Это может быть зафиксировано:

  • Создание неизменного состояния
  • Не совместное использование состояния
  • Защита совместно использовала изменяемое состояние той же блокировкой (две различных блокировки не могут охранять ту же часть состояния, если Вы всегда не используете точно эти две блокировки),

Второй проблемой параллелизма является безопасная публикация. Как Вы делаете доступные данные к другим потокам? Как Вы выполняете передачу? Вы будете решение этой проблемы в модели памяти, и (надо надеяться) в API. Java, например, имеет много способов опубликовать состояние, и java.util.concurrent пакет содержит инструменты, специально предназначенные для обработки коммуникации межпотока.

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

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

13
ответ дан 3 December 2019 в 05:14
поделиться

Исчисление Пи, Теория Мобильных Процессов является хорошим местом для начала.

3
ответ дан 3 December 2019 в 05:14
поделиться

"Принципы параллельного и распределенного программирования", M. Ben-Ari
ISBN-13: 978-0-321-31283-9
Они имеют в на книгах сафари онлайн для чтения:
http://my.safaribooksonline.com/9780321312839

3
ответ дан 3 December 2019 в 05:14
поделиться

Короткий ответ: это твердо.

Была некоторая действительно хорошая работа в DEC SRC Modula-3 и материале лиственницы с конца 1980-х.

например.

Некоторые хорошие идеи от Modula-3 превращают его в мир Java, например, JML, хотя "JML в настоящее время ограничивается последовательной спецификацией," говорит введение.

2
ответ дан 3 December 2019 в 05:14
поделиться

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

1
ответ дан 3 December 2019 в 05:14
поделиться

@Just в случае, если: Я. Но от то, что я изучил, делая так для не тривиального алгоритма, является сильной болью. Я оставляю такую вещь для более мозговитых людей. Я изучил то, что я знаю от Параллельного Проектирования программы: Основа (1988) K M Chandy, J Misra

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

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