2010-10-05 86 views
1

我需要多个线程写入单个缓冲区(连续的内存块)。该强制的方法将作为后续优化并行写入缓冲区

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

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

有人可以请建议一种方法来增加并行性,同时写入单缓冲区?

非常感谢提前。

+0

也许你想要达到的更高的观点将有助于提出这个方案的替代解决方案。如果你有一个单独的缓冲区,它迟早会成为一个瓶颈,但可能会有其他选择(多个缓冲区,缓冲区的分区......) – 2010-10-05 18:42:28

回答

4

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

+0

+1,比我快30秒; – arthurprs 2010-10-05 15:24:23

+0

我认为在您的解决方案中,专用线程将成为瓶颈。看起来这个解决方案推迟了一段时间的问题,但最终我们可能会在相同的情况下结束。 – LionHeart 2010-10-05 15:28:46

+0

缓冲区写入线程对缓冲区具有独占写入访问权限,因此这里没有瓶颈。队列可以同时读写,这里没有瓶颈。 – 2010-10-05 15:34:50

1

如果可能,可以让线程写入不同大小的缓冲区的不同位置,以避免两个线程同时写入同一位置并相应地获取锁定。

0

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