【问题标题】:Optimize Concurrent writes to a buffer优化对缓冲区的并发写入
【发布时间】:2010-10-05 15:17:48
【问题描述】:

我需要让多个线程写入单个缓冲区(连续的内存块)。蛮力方法如下

  1. 要写入缓冲区的线程将获得缓冲区锁定
  2. 整个缓冲区被锁定,因此只有获得锁定的线程才能修改缓冲区。
  3. 线程写入缓冲区。
  4. 线程解锁缓冲区。

此方法序列化所有线程,因为在给定时间只有一个线程处于活动状态。事实证明,这是一个瓶颈,因为应用程序大部分时间都在写入缓冲区。

有人可以建议一种在写入单个缓冲区时增加并行度的方法吗?

非常感谢。

【问题讨论】:

  • 也许对你想要达到的目标有更高的认识有助于提出这个方案的替代解决方案。如果您只有一个缓冲区,迟早会成为瓶颈,但可能会有其他选择(多个缓冲区,缓冲区分区......)

标签: c++ multithreading


【解决方案1】:

让您的线程改为将其数据写入队列。然后,让一个专用线程从队列写入缓冲区。如果这还不够并发,那就牺牲固定的顺序并使用多个队列。

【讨论】:

  • 我认为在您的解决方案中,专用线程将成为瓶颈。看起来这个解决方案将问题推迟了一段时间,但最终我们可能会遇到同样的情况。
  • 缓冲区写入线程对缓冲区具有独占写入权限,因此这里没有瓶颈。队列可以同时读写,这里没有瓶颈。
  • @LionHeart: 简单的 FIFO 队列可以实现无锁,这使得它们非常快,你可能可以找到这样的实现,我知道 Sutter 专门写了一整篇博客文章(使用循环缓冲区队列)。因此,专用线程在从队列中检索时永远不会锁定,也不会在写入缓冲区时锁定。显然,写作还是要付出代价的。
【解决方案2】:

如果可能,您可以让线程以不同大小写入缓冲区的不同位置,这样就不会有两个线程同时写入同一位置并相应地获取锁。

【讨论】:

    【解决方案3】:

    Herb Sutter 几天前发表了一篇非常好的文章,描述了非常接近这种确切情况。他讨论了使用active object 来处理写入共享缓冲区的并发问题。您可以通过访问他的网站并点击链接或this link may work来查看该文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2011-07-02
      相关资源
      最近更新 更多