Sobes.tech
Back to questions
Junior — Middle
78

Какой вид мьютекса допускает повторное захватывание одним и тем же потоком без возникновения взаимной блокировки?

Answer from AI

sobes.tech AI

Вид мьютекса, который допускает повторное захватывание одним и тем же потоком без возникновения взаимной блокировки, называется рекурсивным мьютексом (recursive mutex).

Особенность рекурсивного мьютекса в том, что если поток уже владеет этим мьютексом, он может захватывать его повторно без блокировки. При этом счетчик захватов увеличивается, и мьютекс освобождается только после соответствующего количества вызовов освобождения.

В POSIX pthreads это реализуется с помощью атрибута PTHREAD_MUTEX_RECURSIVE:

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, &attr);

Такой мьютекс удобен, когда один и тот же поток может войти в критическую секцию рекурсивно, например, при вызове вложенных функций, требующих синхронизации.