Функция: прототип int pthread_mutex_unlock(pthread_mutex_t *mutex); Коротко — снимает блокировку с мьютекса, разрешая одному из ожидающих потоков (если есть) захватить его. Ключевые моменты: - Успех/ошибки: возвращает 000 при успехе; возвращает EPERMEPERMEPERM, если текущий поток не является владельцем (для типов mutex, требующих владения); возвращает EINVALEINVALEINVAL, если аргумент невалиден/неинициализирован. - Поведение по типам mutex: - PTHREAD_MUTEX_NORMAL: разблокировка не владельцем — неопределённое поведение. - PTHREAD_MUTEX_ERRORCHECK: попытка разблокировать не своим потоком — возвращается EPERMEPERMEPERM. - PTHREAD_MUTEX_RECURSIVE: каждый вызов разблокировки уменьшает счётчик; мьютекс реально освобождается, когда счётчик достигает 000. - Robust mutexes — имеют дополнительные правила при аварийном завершении владельца (см. pthread_mutex_consistent). - В момент разблокировки один ожидающий поток может быть разбужен и захватит мьютекс (точный выбор/приоритет — зависит от реализации). - Нельзя вызывать pthread_mutex_unlock для мьютекса, который не был предварительно захвачен текущим потоком (если это требуется типом мьютекса) — это ведёт к ошибке или UB. - Разблокировка должна выполняться корректно для предотвращения гонок и дедлоков. Пример: pthread_mutex_lock(&m); /* критическая секция */ pthread_mutex_unlock(&m); Если нужно — могу кратко показать поведение для конкретного типа мьютекса или привести пример с проверкой возвращаемого кода.
int pthread_mutex_unlock(pthread_mutex_t *mutex);
Коротко — снимает блокировку с мьютекса, разрешая одному из ожидающих потоков (если есть) захватить его.
Ключевые моменты:
- Успех/ошибки: возвращает 000 при успехе; возвращает EPERMEPERMEPERM, если текущий поток не является владельцем (для типов mutex, требующих владения); возвращает EINVALEINVALEINVAL, если аргумент невалиден/неинициализирован.
- Поведение по типам mutex:
- PTHREAD_MUTEX_NORMAL: разблокировка не владельцем — неопределённое поведение.
- PTHREAD_MUTEX_ERRORCHECK: попытка разблокировать не своим потоком — возвращается EPERMEPERMEPERM.
- PTHREAD_MUTEX_RECURSIVE: каждый вызов разблокировки уменьшает счётчик; мьютекс реально освобождается, когда счётчик достигает 000.
- Robust mutexes — имеют дополнительные правила при аварийном завершении владельца (см. pthread_mutex_consistent).
- В момент разблокировки один ожидающий поток может быть разбужен и захватит мьютекс (точный выбор/приоритет — зависит от реализации).
- Нельзя вызывать pthread_mutex_unlock для мьютекса, который не был предварительно захвачен текущим потоком (если это требуется типом мьютекса) — это ведёт к ошибке или UB.
- Разблокировка должна выполняться корректно для предотвращения гонок и дедлоков.
Пример:
pthread_mutex_lock(&m);
/* критическая секция */
pthread_mutex_unlock(&m);
Если нужно — могу кратко показать поведение для конкретного типа мьютекса или привести пример с проверкой возвращаемого кода.