Нет, блокировка не снимается автоматически. Вот почему в коде C ++ часто используется Resource Aquisition is Initialization (RAII), которая использует преимущества построения / разрушения, чтобы гарантировать, что каждый вызов функции блокировки имеет соответствующий вызов для разблокировки. Однако, если вы пишете чистый C-код, вам необходимо убедиться, что вы разблокируете мьютекс, даже в ситуациях с ошибками, прежде чем вернуться.
Обратите внимание, что вы можете немного упростить кодирование, выполнив следующие действия:
static inline int some_function_critical_section_unsynchronized(void) {
// ...
}
int some_function(void) {
int status = 0;
pthread_mutex_lock(mutex);
status = some_function_critical_section_unsynchronized();
pthread_mutex_unlock(mutex);
return status;
}
Другими словами, если вы можете разделить логику на более мелкие функции, вы сможете выделить код блокировки из своей логики. Конечно, иногда это невозможно (например, когда при таком кодировании критическая секция становится слишком большой, а для производительности требуется менее читаемая форма).
Если вы можете использовать C ++, я настоятельно рекомендую использовать boost :: thread и boost :: scoped_lock, чтобы гарантировать, что полученный мьютекс автоматически освобождается, когда его использование выходит за рамки.