Как реализовать рекурсивную блокировку с использованием 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