exponenta event banner

Детали критического раздела (-critical-section-begin -critical-section-end)

Укажите функции, начинающие и завершающие критические сечения

Описание

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

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

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

Задать опцию

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

файл командной строки и параметров: Использовать параметр -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();
}

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

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

Настройки

По умолчанию нет

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

  • В программе запуска введите имя функции блокировки.

  • В поле «Завершение подпрограммы» введите имя функции разблокировки.

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

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

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

Зависимости

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

Совет

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

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

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

    Запуск подпрограммы: my_lock
    Завершение процедуры: 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() для начала или завершения критического сечения.

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

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

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

    Для обнаружения таких проблем используйте Finder™ Polyspace Bug. См. раздел Дефекты параллелизма.

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

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

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

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

Параметр: -critical-section-begin | -critical-section-end
По умолчанию нет
Значение: function1:cs1[,function2:cs2[,...]]
Пример (поиск ошибок): polyspace-bug_finder -sources file_name -critical-section-begin func_begin:cs1 -critical-section-end func_end:cs1
Пример (проверка кода): polyspace-code-prover -sources file_name -critical-section-begin func_begin:cs1 -critical-section-end func_end:cs1
Пример (сервер поиска ошибок): polyspace-bug_finder-server -sources file_name -critical-section-begin func_begin:cs1 -critical-section-end func_end:cs1
Пример (сервер проверки кода): polyspace-code-prover-server -sources file_name -critical-section-begin func_begin:cs1 -critical-section-end func_end:cs1