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

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

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

void endTransaction()
{
// release mutex
}

boost::recursive_mutex m_mutex;
}

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

2

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]