Вызов `pthread_mutex_lock(&b)` пытается захватить мьютекс `b`: - Если мьютекс свободен — текущий поток заполняет его и функция возвращает 000. - Если мьютекс занят другим потоком — текущий поток блокируется до освобождения мьютекса (в отличие от `pthread_mutex_trylock`, которая не блокирует). - Если мьютекс уже захвачен этим же потоком: - для типа `PTHREAD_MUTEX_RECURSIVE` счётчик захватов увеличивается (разблокировать нужно столько же раз); - для `PTHREAD_MUTEX_ERRORCHECK` функция вернёт ошибку EDEADLKEDEADLKEDEADLK; - для `PTHREAD_MUTEX_DEFAULT` обычно возникнет дедлок (поток будет ждать сам себя). - Для робастных (robust) мьютексов, если предыдущий владелец умер, может вернуться EOWNERDEADEOWNERDEADEOWNERDEAD — тогда нужно восстановить состояние и вызвать `pthread_mutex_consistent`. - Возможная синтетическая ошибка: если `b` не инициализирован или недействителен — EINVALEINVALEINVAL. После успешного захвата нужно вызвать `pthread_mutex_unlock(&b)` для освобождения. Убедитесь, что мьютекс корректно инициализирован перед использованием.
- Если мьютекс свободен — текущий поток заполняет его и функция возвращает 000.
- Если мьютекс занят другим потоком — текущий поток блокируется до освобождения мьютекса (в отличие от `pthread_mutex_trylock`, которая не блокирует).
- Если мьютекс уже захвачен этим же потоком:
- для типа `PTHREAD_MUTEX_RECURSIVE` счётчик захватов увеличивается (разблокировать нужно столько же раз);
- для `PTHREAD_MUTEX_ERRORCHECK` функция вернёт ошибку EDEADLKEDEADLKEDEADLK;
- для `PTHREAD_MUTEX_DEFAULT` обычно возникнет дедлок (поток будет ждать сам себя).
- Для робастных (robust) мьютексов, если предыдущий владелец умер, может вернуться EOWNERDEADEOWNERDEADEOWNERDEAD — тогда нужно восстановить состояние и вызвать `pthread_mutex_consistent`.
- Возможная синтетическая ошибка: если `b` не инициализирован или недействителен — EINVALEINVALEINVAL.
После успешного захвата нужно вызвать `pthread_mutex_unlock(&b)` для освобождения. Убедитесь, что мьютекс корректно инициализирован перед использованием.