Как реализовать рекурсивную блокировку с использованием boost, охватывающего несколько методов?

У меня есть класс, который открывает транзакции, добавляет операции в очередь, а затем закрывает транзакцию. В течение времени жизни open->close я хотел бы использовать рекурсивный мьютекс, чтобы только один поток мог иметь открытую транзакцию в любое время. Все остальные потоки блокируются до завершения текущей транзакции.

class MyObject
{
  void beginTransaction()
  {
    // acquire mutex
  }

  void endTransaction()
  {
    // release mutex
  }

  boost::recursive_mutex m_mutex;
}

Мне трудно определить, как я могу использовать recursive_mutex в этом случае, поскольку блокировка будет существовать дольше, чем область действия одного метода. Кто-нибудь может подсказать, как я могу применить здесь блокировку?

1 ответ

Решение

Boost (и стандартная библиотека) предоставляют мьютексы, которые можно заблокировать и разблокировать, и блокировки, которые блокируют мьютексы в их конструкторе и разблокируют их в их деструкторе. Замки - это на самом деле просто легкие обертки, которые используются для обеспечения освобождения замка при выходе из области видимости.

В вашем случае вы просто использовали бы мьютекс напрямую, без блокировки.

Ты можешь позвонить m_mutex.lock() в beginTransaction чтобы заблокировать мьютекс, тогда m_mutex.unlock() в endTransaction чтобы разблокировать мьютекс. Если другой поток пытается вызвать m_mutex.lock() между вызовами, он будет блокироваться до тех пор, пока мьютекс не будет разблокирован endTransaction

Другие вопросы по тегам