【问题标题】:Wait for multiple threads (Posix threads, c++)等待多个线程(Posix 线程,c++)
【发布时间】:2013-01-09 11:35:51
【问题描述】:

考虑以下情况:

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

bar() 可以并行执行多次,因为它永远不会改变 foo 的状态。

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

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

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

【问题讨论】:

  • 为什么不在工作线程中围绕 bar 函数的调用引入互斥锁,以及在想要更改 foos 状态的调用线程上引入互斥锁。调用线程锁定互斥体,然后可以安全地更改 foo 的状态。
  • pthread_rwlock_t 您可能会感兴趣。

标签: c++ synchronization pthreads


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2023-03-11
    • 2015-08-23
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多