Critical section details (-critical-section-begin -critical-section-end)

Задайте функции, которые начинают и заканчивают критические разделы

Описание

Эта опция не доступна для кода, сгенерированного из кода MATLAB® или моделей Simulink®.

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

lock();
/* Critical section code */
unlock();
Задайте блокировку и разблокируйте имена функций для своих критических разделов (например, lock() и unlock() в вышеупомянутом примере).

Установите опцию

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

Командная строка: Используйте опцию -critical-section-begin и -critical-section-end. Смотрите информацию о командной строке.

Почему использование эта опция

Когда задача my_task вызывает функцию блокировки my_lock, другие задачи, вызывая my_lock должен ожидать до my_task вызовы соответствие разблокировали функцию. Поэтому критические операции раздела в других задачах не могут прервать критические операции раздела в my_task.

Например, операция var++ в my_task1 и my_task2 не может прервать друг друга.

int var;

void my_task1() {
   my_lock();
   var++;
   my_unlock();
}

void my_task2() {
   my_lock();
   var++; 
   my_unlock();
}

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

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

Настройки

Никакое значение по умолчанию

Щелкните, чтобы добавить поле.

  • В Starting routine введите имя функции блокировки.

  • В Ending routine введите имя, разблокировали функцию.

Введите имена функций или выберите из списка.

  • Щелкните, чтобы добавить поле и ввести имя функции.

  • Щелкните, чтобы перечислить функции в вашем коде. Выберите функции из списка.

Зависимости

Чтобы включить эту опцию в пользовательском интерфейсе десктопных решений, сначала выберите опцию Configure multitasking manually.

Советы

  • Можно также использовать примитивы, такие как функции POSIX® pthread_mutex_lock и pthread_mutex_unlock начать и закончить критические разделы. Для списка примитивов, которые Polyspace может обнаружить автоматически, смотрите Автоматическое обнаружение Создания Потока и Критического Раздела в Polyspace.

  • Для вызовов функции, которые начинают и заканчивают критические разделы, Polyspace игнорирует аргументы функции.

    Например, Polyspace обрабатывает эти две секции кода ниже как тот же критический раздел.

    Starting routine: my_lock
    Ending routine: my_unlock
    void my_task1() {
       my_lock(1);
       /* Critical section code */
       my_unlock(1);
    }
    void my_task2() {
       my_lock(2);
       /* Critical section code */
       my_unlock(2);
    }

    Чтобы работать вокруг ограничения, смотрите, Задают Критические Разделы с Функциями То Взятие Аргументы.

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

    #define init() num_locks++
    Вы не можете использовать макро-init() начать или закончить критический раздел.

  • Когда вы используете несколько критических разделов, можно столкнуться с проблемами, такими как:

    • Мертвая блокировка: последовательность вызовов, чтобы заблокировать функции вызывает две задачи блокировать друг друга.

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

    Используйте Polyspace Bug Finder™, чтобы обнаружить такие проблемы. Смотрите Дефекты Параллелизма (Polyspace Bug Finder).

    Затем используйте Polyspace Code Prover™, чтобы обнаружить, если ваше размещение блокировки и разблокировало функции, на самом деле защищает все совместно используемые переменные от параллельного доступа. Смотрите Глобальные переменные.

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

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

Информация о командной строке

Параметр: -critical-section-begin | -critical-section-end
Никакое значение по умолчанию
Значение: function1:cs1 [function2:cs2 [...]]
Пример (Средство поиска Ошибки): полипробел-bug_finder - источники file_name - "критический раздел начинается" func_begin:cs1 - критический конец раздела func_end:cs1
Пример (Программа автоматического доказательства Кода): Polyspace Code Prover - источники file_name - "критический раздел начинается" func_begin:cs1 - критический конец раздела func_end:cs1
Пример (Сервер Средства поиска Ошибки): polyspace-bug_finder-server - источники file_name - "критический раздел начинается" func_begin:cs1 - критический конец раздела func_end:cs1
Пример (Сервер Программы автоматического доказательства Кода): сервер программы автоматического доказательства полипробела кода - источники file_name - "критический раздел начинается" func_begin:cs1 - критический конец раздела func_end:cs1