6

考虑以下情况:

我有一个由多个线程使用的对象 foo,它可能会或可能不会重复调用 foo 上的方法 bar()。

并行执行多次 bar() 是非常好的(并且是期望的),因为它永远不会改变 foo 的状态。

当我需要从外部(从另一个线程,而不是从“工作”线程之一)更改 foo 的状态时,就会出现问题 - 我如何以某种方式锁定 foo,以便调用线程阻塞直到最后一个工作线程用 bar() 完成,所有工作线程都会在 bar() 处阻塞,直到我再次释放 foo?

显然,我不能只使用在 bar() 执行期间保持锁定的互斥锁,因为那样我就不会有并发性。

有任何想法吗?或者对于这些类型的问题有更好的设计吗?

4

1 回答 1

4

我不确定你将如何实现,没有工作人员使用 foo 让writer更新它,但如果不担心,那么只需使用读/写互斥锁工作人员获取读锁,编写者获取写锁)。

值得一提的是,您可能需要考虑制作 foo Copy-on-Write。这样,您将使同步开销接近于零。您可以原子地使用 shared_ptr来实现这一点。

于 2013-01-09T11:44:23.260 回答