Когда использовать рекурсивное взаимное исключение?

Я понимаю, что рекурсивное взаимное исключение позволяет взаимному исключению быть заблокированным несколько раз, не добираясь до мертвой блокировки и должно быть разблокировано то же количество раз. Но в том, какие определенные ситуации необходимо использовать рекурсивное взаимное исключение? Я ищу design/code-level ситуации.

56
задан jotik 13 May 2016 в 07:41
поделиться

2 ответа

Например, если у вас есть функция, которая вызывает ее рекурсивно, и вы хотите получить к ней синхронизированный доступ:

void foo() {
   ... mutex_acquire();
   ... foo();
   ... mutex_release();
}

без рекурсивного мьютекса вам придется сначала создать функцию «точки входа», и это становится громоздким, когда вы иметь набор функций, которые взаимно рекурсивны. Без рекурсивного мьютекса:

void foo_entry() {
   mutex_acquire(); foo(); mutex_release(); }

void foo() { ... foo(); ... }
48
ответ дан 26 November 2019 в 17:27
поделиться

Несомненно, возникнет проблема, если поток заблокируется, пытаясь получить (снова) мьютекс, которым он уже владеет ...

Есть ли причина не разрешать многократное получение мьютекса одним и тем же потоком?

2
ответ дан 26 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: