2

我有一个类可以打开事务,将操作添加到队列,然后关闭事务。在 open->close 生命周期中,我想使用递归互斥锁,以便在任何时候只有一个线程可以打开事务。所有其他线程都被阻塞,直到当前事务结束。

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

  void endTransaction()
  {
    // release mutex
  }

  boost::recursive_mutex m_mutex;
}

在这种情况下,我很难确定如何使用 a recursive_mutex,因为锁的存在时间会比单个方法的范围更长。谁能建议我如何在这里应用锁定?

4

1 回答 1

1

Boost(和标准库)提供mutexes,可以锁定和解锁,以及locks,在其构造函数中锁定互斥体并在其析构函数中解锁它们。锁实际上只是轻量级的包装器,用于确保在离开作用域时释放锁。

在您的情况下,您只需直接使用互斥锁,而不将其包装在锁中。

您可以调用m_mutex.lock()beginTransaction锁定互斥锁,然后调用m_mutex.unlock()endTransaction解锁互斥锁。如果另一个线程试图在调用m_mutex.lock()之间调用,它将阻塞,直到互斥锁被拥有的线程解锁endTransaction

于 2013-04-30T19:03:13.023 回答