Сегодня я столкнулся с необходимостью рекурсивного мьютекса, и я думаю, что это, пожалуй, самый простой пример из опубликованных ответов:
Это класс, который предоставляет две функции API: Process (...) и reset ().
public void Process(...)
{
acquire_mutex(mMutex);
// Heavy processing
...
reset();
...
release_mutex(mMutex);
}
public void reset()
{
acquire_mutex(mMutex);
// Reset
...
release_mutex(mMutex);
}
Обе функции не должны запускаться одновременно, потому что они изменяют внутренние компоненты класса, поэтому я хотел использовать мьютекс.
Проблема в том, что Process () внутренне вызывает метод reset (), и это может привести к тупику, потому что mMutex уже получен.
Блокировка их с помощью рекурсивной блокировки вместо этого решает проблему.