Вызовите последовательность, чтобы заблокировать причину функций две задачи блокировать друг друга
Это средство проверки деактивировано в Polyspace по умолчанию® как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию.
Этот дефект происходит, когда несколько задач застревают в своих критических разделах (CS) потому что:
Каждый CS ожидает другого CS, чтобы закончиться.
Форма критических разделов (CS) замкнутый цикл. Например:
CS № 1 ожидает CS № 2, чтобы закончиться, и CS № 2 ожидает CS № 1, чтобы закончиться.
CS № 1 ожидает CS № 2, чтобы закончиться, CS № 2 ожидает CS № 3, чтобы закончиться, и CS № 3 ожидает CS № 1, чтобы закончиться.
Polyspace ожидает, что критические разделы кода будут следовать за определенным форматом. Критический раздел находится между вызовом функции блокировки и вызовом разблокировать функции. Когда задача my_task вызывает функцию блокировки my_lock, другие задачи, вызывая my_lock должен ожидать до my_task вызовы соответствие разблокировали функцию. Обе блокировки и разблокировали функции, должен иметь форму void func(void).
Чтобы найти этот дефект, необходимо задать многозадачные опции перед анализом. Чтобы задать эти опции, на панели Configuration, выбирают Multitasking.
Каждая задача ожидает критического раздела в другой задаче закончиться и не может продолжить. Программа может заморозиться неопределенно.
Фиксация зависит от первопричины дефекта. Можно попытаться повредить циклический порядок между задачами одним из этих способов:
Запишите все критические разделы, вовлеченные в мертвую блокировку в определенной последовательности. Каждый раз, когда вы вызываете функции блокировки критических разделов в задаче, уважаете порядок в той последовательности. Смотрите пример ниже.
Если один из критических разделов, вовлеченных в мертвую блокировку, происходит в прерывании, попытайтесь отключить все прерывания во время критических разделов во всех задачах. Смотрите Disabling all interrupts (-routine-disable-interrupts -routine-enable-interrupts).
Рассмотрение этого дефекта является возможностью проверять, предназначены ли все операции в вашем критическом разделе действительно, чтобы быть выполненными как атомарный блок. Это - хорошая практика, чтобы сохранить критические разделы как минимум.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. См.:
Обратитесь к Результатам Polyspace Через Исправления ошибок или Выравнивания, если вы рассматриваете результаты в пользовательском интерфейсе Polyspace.
Обратитесь к Результатам в Polyspace доступ Через Исправления ошибок или Выравнивания, если вы рассматриваете результаты в веб-браузере.
Аннотируйте Код и Скройте Известные или Приемлемые результаты, если вы рассматриваете результаты в IDE.
| Группа: параллелизм |
| Язык: C | C++ |
| Значение по умолчанию: On |
Синтаксис командной строки: DEADLOCK |
| Удар: высоко |
| ID CWE: 833 |
Temporally exclusive tasks (-temporal-exclusions-file) | Critical section details (-critical-section-begin -critical-section-end) | Tasks (-entry-points) | Configure multitasking manually | Find defects (-checkers) | Data race including atomic operations | Data race | Data race through standard library function call | Destruction of locked mutex | Double lock | Double unlock | Missing lock | Missing unlock