У меня есть класс, который открывает транзакции, добавляет операции в очередь, а затем закрывает транзакцию. В течение времени жизни open-> close я хотел бы использовать рекурсивный мьютекс, чтобы только один поток мог иметь открытую транзакцию в любое время. Все остальные потоки блокируются до завершения текущей транзакции.
class MyObject
{
void beginTransaction()
{
// acquire mutex
}
void endTransaction()
{
// release mutex
}
boost::recursive_mutex m_mutex;
}
Мне трудно определить, как я могу использовать recursive_mutex
в этом случае, поскольку блокировка будет существовать дольше, чем область действия одного метода. Кто-нибудь может подсказать, как я могу применить здесь блокировку?
Boost (и стандартная библиотека) обеспечивают мьютексы, которые могут быть заблокированы и разблокированы, и замки, которые блокируют мьютексы в их конструкторе и разблокируют их в их деструкторе. Замки — это на самом деле легкие обертки, которые используются для обеспечения освобождения замка при выходе из области видимости.
В вашем случае вы просто использовали бы мьютекс напрямую, без блокировки.
Ты можешь позвонить m_mutex.lock()
в beginTransaction
чтобы заблокировать мьютекс, тогда m_mutex.unlock()
в endTransaction
чтобы разблокировать мьютекс. Если другой поток пытается вызвать m_mutex.lock()
между вызовами, он будет блокироваться до тех пор, пока мьютекс не будет разблокирован endTransaction
Других решений пока нет …