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

6
考虑以下情况:
我有一个对象foo,被多个线程使用,这些线程可能会重复调用foo的方法bar()。
当bar()在并行执行时,它不会改变foo的状态,这是完全可以的(也是期望的)。
问题出现在我需要从外部更改foo的状态时(来自另一个线程,而不是其中一个“工作”线程)-如何以一种方式锁定foo,使得调用线程阻塞,直到最后一个工作线程完成bar(),并且所有工作线程都将在bar()处阻塞,直到我再次释放foo?
显然,我不能只使用一个互斥量,在bar()执行期间保持锁定,因为那样就无法实现并发。
有什么想法吗?或者是否有更好的设计来解决这些类型的问题?

3
请参阅读写锁 - hmjd
为什么不在工作线程中引入一个互斥锁,用于调用bar函数以及想要改变foo状态的调用线程。调用线程锁定互斥锁,然后可以安全地改变foo的状态。 - mgr
2
pthread_rwlock_t 可能会对您感兴趣。 - WhozCraig
1个回答

4
我不确定您如何实现,让工作线程都不使用foo来使写入器进行更新,但如果这并不是问题,请使用读写互斥锁工作线程获取读取锁,写入器获取写入锁)。
值得一提的是,你可能要考虑将foo设置为写时复制。这样,同步开销将接近于零。您可以使用原子shared_ptr来实现这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接