Вызовите последовательность, чтобы заблокировать причину функций две задачи блокировать друг друга
Мертвая блокировка происходит, когда несколько задач застревают в своих критических разделах (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 Адреса Через Исправления ошибок или Комментарии.
| Группа: параллелизм |
| Язык: C | C++ |
| Значение по умолчанию: на |
Синтаксис командной строки: DEADLOCK |
| Влияние: высоко |
| ID CWE: 833 |
Configure multitasking manually | Critical section details (-critical-section-begin -critical-section-end) | Data race | Data race including atomic operations | Data race through standard library function call | Destruction of locked mutex | Double lock | Double unlock | Find defects (-checkers) | Missing lock | Missing unlock | Tasks (-entry-points) | Temporally exclusive tasks (-temporal-exclusions-file)