4

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

  1. 数据线程正在写入缓冲区 1,而显示线程正在读取缓冲区 2
  2. 一旦对缓冲区完成写入,数据线程就会切换到另一个缓冲区(缓冲区 2)并开始写入新页面。
  3. 对于读取,如果一个缓冲区正在写入,则显示线程从另一个缓冲区读取。

它实际上运行良好,但有时(每 100 帧 1 个)我可以看到显示器撕裂,这意味着仍然存在竞争条件。

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

4

2 回答 2

1

您正在使用什么语言、平台和(如有必要)图形 API?

一个伪算法对我来说就足够了。

根据情况有多种方法,您确实应该更具体。例如,您可以声明临界区,以便线程 1 在写入时等待,而线程 2 正在读取,依此类推——但有理由不这样做。

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

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

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

DisplayThread.Run() {
  Wait(message);
  SwapBuffer(message.bufferNumber);
  Render(buffer);
  SendMessage(message.defaultMessage());
}
于 2011-12-28T02:35:39.573 回答
1

你可以用两个信号量来做到这一点。它是生产者/消费者问题的变体。我提供的链接中的伪代码。

于 2011-12-28T02:48:30.493 回答