4

我正在使用 C++,并且正在使用 boost 库 mutex、recursive_mutex 和其他同步对象。

我经常有以下模式:

  • 无效重建所有()。此功能进行了许多内部更改。
  • 无效 DoSomethingA()。使用 RebuildAll 构建的东西做一些工作。
  • 无效 DoSomethingB()。使用 RebuildAll 构建的东西做一些工作。
  • 无效 DoSomethingC()。使用 RebuildAll 构建的东西做一些工作。
  • ...

可以从不同的线程调用这些函数。我希望能够并行执行 DoSomethingA()、DoSomethingB() 和 DoSomethingC()。但是当调用 RebuildAll() 时,我需要确保 DoSomething 函数没有被执行。

有什么可以帮助我保护这些功能吗?

4

1 回答 1

4

这通常称为读写锁。读写锁的规则是:

  • 可以在任何给定时间获取任意数量的读锁,可能是由不同的线程。
  • 只有一位写入者才能获得锁,并且只有在所有读取者都完成时。
  • 当作者拥有锁时,没有读者可以获取锁。

在您的示例中,RebuildAll()将是作家,而DoSomethingA()通过DoSomethingC()将是读者。

Boost 有一个读写锁的实现,称为boost::shared_mutex. 不过,这还没有在标准库中。

于 2012-12-19T22:22:22.700 回答