【问题标题】:How to synchronize between many threads. Only one is writing如何在多个线程之间进行同步。只有一个在写
【发布时间】:2012-07-04 16:47:34
【问题描述】:

进程在其生命周期内有 1 个主线程和 1 到 50 个其他工作线程。 当主线程接受新连接时,它会将其保存在 boost::unordered_map 中,我们称之为“新 con 容器”。工作线程不时检查“新 con 容器”是否有新连接。出于同步目的,有一个 boost::mutex。当主线程写入“new con container”时,它会锁定这个互斥锁。检查此容器时的工作线程也会锁定互斥锁。

有没有办法让工作线程不锁定互斥锁并从“新con容器”中安全地读取?工作线程对套接字进行实时操作,因此锁定互斥体会影响性能。

【问题讨论】:

  • 一个工作线程如何决定应该处理哪个新连接,以及下一个工作线程如何知道不在同一个连接上工作?
  • goog:许多线程正在阅读

标签: c++ multithreading boost concurrency locking


【解决方案1】:

如果您有一个作者和多个读者,请考虑使用shared_mutex

类 boost::shared_mutex 提供了一个实现 多读/单写互斥体。

【讨论】:

  • 写线程应该调用lock();读者线程应该在 shared_mutex 上调用 lock_shared()。对吗?
  • @Didar_Uranov:这里有一些很好的例子,shared_lockstackoverflow.com/questions/989795/…
  • 这绝对是我需要的!非常感谢!
【解决方案2】:

您应该使用条件变量让工作线程阻塞,直到其中一个有事情要做,而不是通过工作线程轮询“新 con 容器”。这将减少争用,从而减少锁的开销。

您还可以对容器进行分区。与其拥有一个容器,不如使用更多并为每个容器分配一组固定的线程。然后主线程会将每个新连接推送到不同的容器。

亲切的问候 托斯滕

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多