c++ - std::recursive_mutex




Когда использовать рекурсивный мьютекс? (4)

Если вы хотите увидеть пример кода, который использует рекурсивные мьютексы, посмотрите на источники для «Electric Fence» для Linux / Unix. «Twas - один из распространенных инструментов Unix для поиска« проверки границ »перерасходами чтения и записи и недоработками, а также с использованием освобожденной памяти до того, как появился Valgrind .

Просто скомпилируйте и подключите электрический забор с источниками (опция -g с gcc / g ++), а затем привяжите его к вашему программному обеспечению с помощью опции ссылки - освободителю и начните переходить через вызовы в malloc / free.

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


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

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

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

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

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

Сегодня я столкнулся с необходимостью рекурсивного мьютекса, и я думаю, что это самый простой пример среди опубликованных ответов: это класс, который предоставляет две функции 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);
}

Обе функции не должны запускаться одновременно, поскольку они изменяют внутренние элементы класса, поэтому я хотел использовать мьютекс. Проблема заключается в том, что процесс () вызывает reset () внутренне, и это создаст тупик, потому что mMutex уже получен. Исправлена ​​проблема блокировки их рекурсивным замком.


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

Есть ли причина, по которой не допускается одновременное получение мьютекса одним и тем же потоком?







recursive-mutex