Это вызов освобождения мьютекса `b`: попытка снять блокировку, взятую ранее текущим потоком. Коротко: - Смысл: `pthread_mutex_unlock(&b)` снимает блокировку с мьютекса `b` и пробуждает один из потоков, ожидающих этой блокировки (если есть). - Возвращаемое значение: функция возвращает целое; при успешном разблокировании возвращается 000. - Поведение при разных типах мьютекса: - Для `PTHREAD_MUTEX_RECURSIVE` вызов уменьшает счётчик рекурсивных захватов; реальное освобождение происходит только когда счётчик станет 000. - Для `PTHREAD_MUTEX_ERRORCHECK` или `PTHREAD_MUTEX_RECURSIVE` попытка разблокировать мьютекс, который не принадлежит текущему потоку, приведёт к ошибке (возвращается `EPERM`). - Для обычного (default/fast) мьютекса попытка разблокировать мьютекс, не захваченный текущим потоком, либо уже разблокированный мьютекс — UB (неопределённое поведение). - Синхронизация: вызов имеет семантику "release" — изменения памяти, сделанные до разблокировки, будут видимы потоку, который затем успешно захватит мьютекс. - Требования: перед вызовом мьютекс должен быть корректно инициализирован (`pthread_mutex_init` или статически). Нельзя уничтожать мьютекс, пока он заблокирован. Пример правильного шаблона: pthread_mutex_lock(&b); ... /* критическая секция */ pthread_mutex_unlock(&b);
Коротко:
- Смысл: `pthread_mutex_unlock(&b)` снимает блокировку с мьютекса `b` и пробуждает один из потоков, ожидающих этой блокировки (если есть).
- Возвращаемое значение: функция возвращает целое; при успешном разблокировании возвращается 000.
- Поведение при разных типах мьютекса:
- Для `PTHREAD_MUTEX_RECURSIVE` вызов уменьшает счётчик рекурсивных захватов; реальное освобождение происходит только когда счётчик станет 000.
- Для `PTHREAD_MUTEX_ERRORCHECK` или `PTHREAD_MUTEX_RECURSIVE` попытка разблокировать мьютекс, который не принадлежит текущему потоку, приведёт к ошибке (возвращается `EPERM`).
- Для обычного (default/fast) мьютекса попытка разблокировать мьютекс, не захваченный текущим потоком, либо уже разблокированный мьютекс — UB (неопределённое поведение).
- Синхронизация: вызов имеет семантику "release" — изменения памяти, сделанные до разблокировки, будут видимы потоку, который затем успешно захватит мьютекс.
- Требования: перед вызовом мьютекс должен быть корректно инициализирован (`pthread_mutex_init` или статически). Нельзя уничтожать мьютекс, пока он заблокирован.
Пример правильного шаблона:
pthread_mutex_lock(&b);
... /* критическая секция */
pthread_mutex_unlock(&b);