如何在多线程应用程序中同步双缓冲

时间:2011-12-28 01:40:46

标签: multithreading double-buffering

我有两个线程,一个用于数据采集,另一个用于显示。为了避免不必要的同步。我使用双缓冲(或页面翻转)如下:

  1. 数据线程正在写入缓冲区1而显示线程正在读取缓冲区2
  2. 一旦为缓冲区写入,数据线程就切换到另一个缓冲区(缓冲区2)并开始写入新页面。
  3. 对于读取,如果缓冲区正在写入,则显示线程从另一个缓冲区读取。
  4. 它实际上运作良好,但有时(每100帧1个)我可以看到在显示屏上撕裂,这意味着仍有竞争条件。

    那么如何实现这种双缓冲的最小(有效)同步?伪算法对我来说已经足够了。

2 个答案:

答案 0 :(得分:1)

您使用的是哪种语言,平台和(如果需要)Graphics API?

  

伪算法对我来说已经足够了。

根据具体情况,有多种方法,你真的应该更具体。例如,您可以声明关键部分,以便线程1在线程2正在读取时等待,等等 - 但有理由不这样做。

您可以使用消息传递,这将唤醒绘图线程而不是处理关键部分。所以它在很大程度上取决于语言,平台和图形API。

以下是一些使用消息传递来同步渲染和传输到图形的代码:

DataAcquisitionThread.Run() {
  ProcessData();
  Wait(message);
  DrawToBackBuffer();
}

DisplayThread.Run() {
  Wait(message);
  SwapBuffer(message.bufferNumber);
  Render(buffer);
  SendMessage(message.defaultMessage());
}

答案 1 :(得分:1)

您可以使用两个信号量来完成此操作。这是Producer/Consumer问题的变体。我提供的链接中的伪代码。