【问题标题】:double buffer design I/O synchronization双缓冲设计 I/O 同步
【发布时间】:2011-07-22 14:40:27
【问题描述】:

如果我的应用程序生成数据缓慢但消耗数据很快,那么它是否适合双缓冲区实现?基本思想是让生产者填充后缓冲区,而消费者处理前缓冲区。 我不希望客户端看起来好像在等待数据。我想平衡生产和消费。我怎样才能实现这个功能?即使我有一个后台缓冲区线程......它也必须与前台缓冲区线程同步,以便前台缓冲区知道何时有新数据(缓冲区已交换)。如果后台缓冲区线程产生数据的时间过长,那么前台缓冲区将不得不等待处理它。

void fill_back_buffer() {

   //wait to fill buffer
   //fill back buffer


   //swap buffers and notify other thread
}

void process_data() {

  //wait to see if buffers have been swapped


  //buffers been swapped so send data out
  //while sending data out start filling back buffer with new data
}

【问题讨论】:

    标签: c multithreading pthreads doublebuffered


    【解决方案1】:

    如果您的应用程序“产生数据缓慢但消耗数据很快”,这将限制您从双缓冲中获得的收益。

    如果生成一个充满数据的缓冲区需要 10 秒,而消耗它需要 1 秒,那么双缓冲可以将吞吐量提高 10%,但如果生成和消耗都需要相同的时间,双缓冲可能将您的吞吐量翻倍。

    例如:

    • produce_time = 10 秒
    • consume_time = 1 秒
    • 缓冲区数 = 100

    顺序处理 = 100 * (10 + 1) = 1,100 秒
    双缓冲 = 100 * 10 = 1,000 秒

    但是,如果我们改变参数那么consume_time = 10秒:

    顺序处理 = 100 * (10 + 10) = 2,000 秒
    双缓冲 = 100 * 10 = 1,000 秒

    【讨论】:

    • 是的。如果它很慢也没关系。我真正想要实现的是正确的同步,以便在生产者和消费者之间顺利分配时间。我意识到我的问题很模糊。感谢您的贡献。
    猜你喜欢
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2012-01-14
    • 2011-08-05
    • 1970-01-01
    • 2016-06-04
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多