等待多个线程(Posix线程,c ++)

时间:2013-01-09 11:35:51

标签: c++ synchronization pthreads

考虑以下情况:

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

bar()并行执行多次是完全正确的(并且是期望的),因为它永远不会改变foo的状态。

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

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

有什么想法吗?或者对于那些类型的问题有更好的设计吗?

1 个答案:

答案 0 :(得分:4)

我不确定你将如何实现, worker 都没有使用foo让 writer 更新它,但如果它不是一个问题那么只需使用read/write mutex workers 获取读锁, writer 来获取写锁定。)

值得一提的是,你可能想考虑制作foo Copy-on-Write。这样,您将使同步开销接近于零。您可以使用shared_ptr atomically来实现这一目标。