我正在处理实时应用程序,分为两部分(线程):
处理的输出是一个固定大小的数组(float
)并保持实时性能我想将这些数据发送到另一个线程,该线程将按照自己的节奏绘制,例如图形。
我已经研究过atomic
和lock
但我无法弄清楚如何使应用程序线程安全,因为这两个进程是完全独立的。
示例代码:
class A {
float data[n];
processData() {
data = ... ;
}
}
class B {
void draw() {
// requires data[] from class A
}
}
两个类都在主线程中初始化,我试图在那里定义一个float*
指针并将其传递给另外两个线程,处理将它分配给data[]
并且图形能够读取但是当一个人正在阅读而另一个人正在同时修改它时,显然会出现错误。
答案 0 :(得分:2)
最简单的解决方案是使用std::mutex
来阻止两个线程同时访问数据。
当然,这意味着一次只有一个线程可以对数据做些什么。如果这是一个瓶颈(即您想在绘制以前的数据时生成新数据),请考虑double buffering。这样,阅读和写作都可以同时发生。请注意,您仍然需要使用以下方式进行某种同步:一个互斥锁,以确保编写器不会开始写入读取器当前正在使用的缓冲区(反之亦然)。你可以通过使用三重缓冲来改进它。
答案 1 :(得分:2)
您可以为图形输出和互斥锁创建浮点值的队列。
每当处理生成一些输出时,锁定公共互斥锁,将数据附加到队列,解锁互斥锁。
另一方面,定期从图形线程锁定互斥锁,查看是否有新数据显示,如果是,则从队列中删除该数据,暂时将其复制到线程本地数据缓冲区以确保在执行图形输出时,互斥锁未锁定,并在复制数据后立即解锁互斥锁。然后使用本地副本显示该线程中的图形。