Это вызов разблокировки мьютекса `a`. Кратко: - Что делает: освобождает мьютекс `a`; если есть потоки, ожидающие мьютекс, один из них будет разбужен и сможет захватить мьютекс. - Кто может вызывать: как правило только поток, который ранее захватил мьютекс (`pthread_mutex_lock`/`trylock`). - Возврат: успех — (0)(0)(0). Ошибки: EINVAL\text{EINVAL}EINVAL (невалидный объект мьютекса), EPERM\text{EPERM}EPERM (поток не владеет мьютексом / ошибка владения в типах, проверяющих ошибки). - Особенности по типам мьютекса: - PTHREAD_MUTEX_RECURSIVE\text{PTHREAD\_MUTEX\_RECURSIVE}PTHREAD_MUTEX_RECURSIVE: разблокировка уменьшает счётчик; мьютекс полностью освобождается, когда счётчик становится (0)(0)(0). - PTHREAD_MUTEX_ERRORCHECK\text{PTHREAD\_MUTEX\_ERRORCHECK}PTHREAD_MUTEX_ERRORCHECK: попытка разблокировать мьютекс, не принадлежащий текущему потоку, вернёт EPERM\text{EPERM}EPERM. - PTHREAD_MUTEX_DEFAULT\text{PTHREAD\_MUTEX\_DEFAULT}PTHREAD_MUTEX_DEFAULT: разблокировка мьютекса, не принадлежащего текущему потоку, приводит к неопределённому поведению. - Дополнительно: разблокировка уничтоженного мьютекса — неопределённое поведение; вызов из обработчика сигналов небезопасен; для robust‑mutex есть отдельная семантика при смерти владельца (см. pthread_mutex_consistent). Пример проверки: ``` if (pthread_mutex_unlock(&a) != 0) { // обработка ошибки } ```
Кратко:
- Что делает: освобождает мьютекс `a`; если есть потоки, ожидающие мьютекс, один из них будет разбужен и сможет захватить мьютекс.
- Кто может вызывать: как правило только поток, который ранее захватил мьютекс (`pthread_mutex_lock`/`trylock`).
- Возврат: успех — (0)(0)(0). Ошибки: EINVAL\text{EINVAL}EINVAL (невалидный объект мьютекса), EPERM\text{EPERM}EPERM (поток не владеет мьютексом / ошибка владения в типах, проверяющих ошибки).
- Особенности по типам мьютекса:
- PTHREAD_MUTEX_RECURSIVE\text{PTHREAD\_MUTEX\_RECURSIVE}PTHREAD_MUTEX_RECURSIVE: разблокировка уменьшает счётчик; мьютекс полностью освобождается, когда счётчик становится (0)(0)(0).
- PTHREAD_MUTEX_ERRORCHECK\text{PTHREAD\_MUTEX\_ERRORCHECK}PTHREAD_MUTEX_ERRORCHECK: попытка разблокировать мьютекс, не принадлежащий текущему потоку, вернёт EPERM\text{EPERM}EPERM.
- PTHREAD_MUTEX_DEFAULT\text{PTHREAD\_MUTEX\_DEFAULT}PTHREAD_MUTEX_DEFAULT: разблокировка мьютекса, не принадлежащего текущему потоку, приводит к неопределённому поведению.
- Дополнительно: разблокировка уничтоженного мьютекса — неопределённое поведение; вызов из обработчика сигналов небезопасен; для robust‑mutex есть отдельная семантика при смерти владельца (см. pthread_mutex_consistent).
Пример проверки:
```
if (pthread_mutex_unlock(&a) != 0) {
// обработка ошибки
}
```