Я понимаю, что рекурсивное взаимное исключение позволяет взаимному исключению быть заблокированным несколько раз, не добираясь до мертвой блокировки и должно быть разблокировано то же количество раз. Но в том, какие определенные ситуации необходимо использовать рекурсивное взаимное исключение? Я ищу design/code-level ситуации.
Например, если у вас есть функция, которая вызывает ее рекурсивно, и вы хотите получить к ней синхронизированный доступ:
void foo() {
... mutex_acquire();
... foo();
... mutex_release();
}
без рекурсивного мьютекса вам придется сначала создать функцию «точки входа», и это становится громоздким, когда вы иметь набор функций, которые взаимно рекурсивны. Без рекурсивного мьютекса:
void foo_entry() {
mutex_acquire(); foo(); mutex_release(); }
void foo() { ... foo(); ... }
Несомненно, возникнет проблема, если поток заблокируется, пытаясь получить (снова) мьютекс, которым он уже владеет ...
Есть ли причина не разрешать многократное получение мьютекса одним и тем же потоком?