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