我有两个线程,一个用于数据采集,另一个用于显示。为了避免不必要的同步。我使用双缓冲(或翻页)如下:
- 数据线程正在写入缓冲区 1,而显示线程正在读取缓冲区 2
- 一旦对缓冲区完成写入,数据线程就会切换到另一个缓冲区(缓冲区 2)并开始写入新页面。
- 对于读取,如果一个缓冲区正在写入,则显示线程从另一个缓冲区读取。
它实际上运行良好,但有时(每 100 帧 1 个)我可以看到显示器撕裂,这意味着仍然存在竞争条件。
那么如何实现这种双缓冲的最小(有效)同步呢?一个伪算法对我来说就足够了。
我有两个线程,一个用于数据采集,另一个用于显示。为了避免不必要的同步。我使用双缓冲(或翻页)如下:
它实际上运行良好,但有时(每 100 帧 1 个)我可以看到显示器撕裂,这意味着仍然存在竞争条件。
那么如何实现这种双缓冲的最小(有效)同步呢?一个伪算法对我来说就足够了。
您正在使用什么语言、平台和(如有必要)图形 API?
一个伪算法对我来说就足够了。
根据情况有多种方法,您确实应该更具体。例如,您可以声明临界区,以便线程 1 在写入时等待,而线程 2 正在读取,依此类推——但有理由不这样做。
您可以只使用消息传递,这将唤醒绘图线程而不是使用关键部分。所以它在很大程度上取决于语言、平台和图形 API。
下面是一些使用消息传递来同步渲染和传输到图形的代码:
DataAcquisitionThread.Run() {
ProcessData();
Wait(message);
DrawToBackBuffer();
}
DisplayThread.Run() {
Wait(message);
SwapBuffer(message.bufferNumber);
Render(buffer);
SendMessage(message.defaultMessage());
}
你可以用两个信号量来做到这一点。它是生产者/消费者问题的变体。我提供的链接中的伪代码。