Подтвердить что ты не робот

Какой код можно назвать "повторным"?

Может ли кто-нибудь сказать мне, какой код можно назвать кодом "повторного входа"?

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

4b9b3361

Ответ 1

В общем случае блок повторного ввода кода является тем, который может быть введен другим субъектом до завершения предыдущего вызова, не затрагивая путь, который первый актер взял бы через код. То есть, можно повторно ввести код, пока он уже запущен, и все еще давать правильные результаты.

В большинстве случаев "актеры" представляют собой потоки одного и того же процесса, но концепции безопасность потоков и повторный вход немного отличаются: не каждый поточно-безопасный блок является повторным, но каждый блок повторного входа является потокобезопасным. То есть повторное включение является более сильным, чем безопасность потоков. Здесь хороший пример от Раймонда Чена о том, как блок кода может быть потокобезопасным, но не повторным.

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

Ответ 2

Джон Фэминелла отвечает:

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

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

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

Ни один вызов не должен распознавать "присутствие" другого.

Ответ 3

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

public void AddIfNecessary(string s) {
    lock(syncObj) {
        if(!Contains(s)) Add(s);
    }
}

public void Add(string s) {
    lock(syncObj) {
        list.Add(s);
    }
}

public bool Contains(string s) {
    lock(syncObj) {
        return list.Contains(s);
    }
}

Здесь тот факт, что блокировка является повторной попыткой, означает, что мы можем вызывать Contains и Add, не опасаясь, что у нас уже есть "исключительная" блокировка, что делает код более простым. Внутри используется счетчик, а не простой флаг "в использовании".

Ответ 4

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

Ответ 5

Может ли другой поток вызывать код, пока первый поток находится в середине его запуска? Если код дает функцию обратного вызова, может ли сама функция обратного вызова вызывать код до завершения первого выполнения?

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

Ответ 6

Код, который может вызываться разными потоками, выполняющимися параллельно. Итак, код:

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

Ответ 7

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

Ответ 8

Невозвратный пример

class Test {
    int count;

    // Here method1() is not reentrant
    int method1()
    {
        return count + 1;
    }
}

Повторный пример

class Test {
    int count;

    // Here method1() is reentrant
    int method1(int count)
    {
        return count + 1;
    }
}

Ответ 9

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

Это возможно, когда выполняются следующие условия:

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

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