我有两个线程,一个用于数据采集,另一个用于显示。为了避免不必要的同步。我使用双缓冲(或页面翻转)如下:
它实际上运作良好,但有时(每100帧1个)我可以看到在显示屏上撕裂,这意味着仍有竞争条件。
那么如何实现这种双缓冲的最小(有效)同步?伪算法对我来说已经足够了。
答案 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问题的变体。我提供的链接中的伪代码。