Задача выполняет длительную операцию, удерживая блокировку
Этот дефект возникает, когда задача (поток) выполняет потенциально длительную операцию при удержании блокировки.
Средство проверки рассматривает вызовы этих функций как потенциально длительные:
Функции, получающие доступ к сети, такие как recv
Функции вызова системы, такие как fork, pipe и system
Функции для операций ввода-вывода, такие как getchar и scanf
Функции обработки файлов, такие как fopen, remove и lstat
Функции управления каталогами, такие как mkdir и rmdir
Средство проверки автоматически обнаруживает определенные примитивы, которые удерживают и снимают блокировку, например, pthread_mutex_lock и pthread_mutex_unlock. Полный список автоматически обнаруживаемых примитивов см. в разделе Автоматическое обнаружение создания потоков и критического сечения в Polyspace.
Если поток выполняет длительную операцию при удержании блокировки, другие потоки, использующие блокировку, должны ждать, пока блокировка будет доступна. В результате производительность системы может замедлиться или возникнуть взаимоблокировка.
Операцию блокировки выполняйте перед удержанием замка или после освобождения замка.
Некоторые функции, обнаруженные этой проверкой, могут вызываться таким образом, чтобы не делать их потенциально длинными. Например, функция recv может вызываться с параметром O_NONBLOCK что приводит к сбою вызова, если сообщение недоступно. При вызове с этим параметром recv не ожидает, пока сообщение станет доступным.
| Группа: Параллелизм |
| Язык: C | C++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
BLOCKING_WHILE_LOCKED |
| Воздействие: Низкий |
| ИДЕНТИФИКАТОР CWE : 667 |