C++ c++;11在不同类之间共享固定大小的数组

C++ c++;11在不同类之间共享固定大小的数组,c++,multithreading,c++11,C++,Multithreading,C++11,我正在处理分为两部分(线程)的实时应用程序: 加工 图形 处理的输出是一个固定大小的数组(float),为了保持实时性能,我想将这些数据发送到另一个线程,该线程将以自己的速度绘制,例如图形 我已经研究了atomic和lock,但是考虑到这两个进程是完全独立的,我不知道如何使应用程序线程安全。 示例代码: class A { float data[n]; processData() { data = ... ; } } class B { v

我正在处理分为两部分(线程)的实时应用程序:

  • 加工
  • 图形
处理的输出是一个固定大小的数组(float),为了保持实时性能,我想将这些数据发送到另一个线程,该线程将以自己的速度绘制,例如图形
我已经研究了
atomic
lock
,但是考虑到这两个进程是完全独立的,我不知道如何使应用程序线程安全。

示例代码:

class A {
    float data[n];
    processData() {
        data = ... ;
    }
}

class B {
    void draw() {
        // requires data[] from class A
    }
}

这两个类都在主线程中初始化,我试图在那里定义一个
float*
指针,并将其传递给其他两个线程,processing将其分配给
data[]
和graphics能够读取数据,但当一个正在读取而另一个正在同时修改数据时,会出现明显的错误。

最简单的解决方案是使用,以防止两个线程同时访问数据


当然,这意味着一次只有一个线程可以处理数据。如果这是一个瓶颈(即,在生成以前的数据时要生成新数据),请考虑。这样,阅读和写作可以同时进行。请注意,您仍然需要使用某种类型的同步,例如互斥,以确保写入程序不会开始写入读卡器当前正在使用的缓冲区(反之亦然)。您可以通过使用三重缓冲来改进这一点。

最简单的解决方案是使用一个来防止两个线程同时访问数据


当然,这意味着一次只有一个线程可以处理数据。如果这是一个瓶颈(即,在生成以前的数据时要生成新数据),请考虑。这样,阅读和写作可以同时进行。请注意,您仍然需要使用某种类型的同步,例如互斥,以确保写入程序不会开始写入读卡器当前正在使用的缓冲区(反之亦然)。您可以通过使用三重缓冲来改进这一点。

您可以为图形输出和互斥创建一个浮点值队列

每当处理生成一些输出时,锁定公共互斥体,将数据附加到队列,解锁互斥体


另一方面,定期从图形线程锁定互斥体,查看是否有新数据要显示,如果有,则从队列中删除该数据,临时将其复制到线程本地数据缓冲区,以确保在执行图形输出时互斥体未被锁定,并在复制数据后立即解锁互斥体。然后使用本地副本在该线程中显示图形。

您可以为图形输出和互斥创建一个浮点值队列

每当处理生成一些输出时,锁定公共互斥体,将数据附加到队列,解锁互斥体


另一方面,定期从图形线程锁定互斥体,查看是否有新数据要显示,如果有,则从队列中删除该数据,临时将其复制到线程本地数据缓冲区,以确保在执行图形输出时互斥体未被锁定,并在复制数据后立即解锁互斥体。然后使用本地副本显示该线程中的图形。

数组的大小是多少?它可能会有所不同(不是在运行时),但通常是256、512或1024Side注意:因为您使用的是C++11,所以不需要“原始”数组。两个进程是完全独立的进程!=Thread数组的大小是多少?它可以变化(不是在运行时),但通常是256、512或1024Side注:由于您使用的是C++11,不需要“原始”数组,因此没有。两个进程是完全独立的进程!=threadyes我希望在绘图时继续处理数据,因为后者的优先级较低,更易于使用。双缓冲的问题是,两个部分的“刷新”速率不同,可以变化为2倍或3倍(例如,每10毫秒处理一次数据,每秒绘制一个新帧)。还有可能吗?@mastaH是的,如果你使用三重缓冲,你可以尽可能快地运行读写器。您可以在此处找到实现此功能的代码示例:。是的,我希望在绘图时继续处理数据,因为后者优先级较低,更易于使用。双缓冲的问题是,两个部分的“刷新”速率不同,可以变化为2倍或3倍(例如,每10毫秒处理一次数据,每秒绘制一个新帧)。还有可能吗?@mastaH是的,如果你使用三重缓冲,你可以尽可能快地运行读写器。您可以在此处找到实现此功能的代码示例:。尝试时,我无法在不同的类之间共享公共互斥体,介意发布一个简单的示例吗?您尝试了什么?您可以通过编辑将代码添加到问题中。为什么您不能“共享”互斥锁?您只需要两个类都可以访问的一个互斥变量。首先,您可以全局声明一个
std::mutex procMu
,并从两个线程中使用它。我没有尝试将其声明为全局变量,而是将其传递给两个类,但这会产生错误(无法复制)。当我写这篇文章的时候,我意识到很明显我不能复制它,我应该把它作为指针传递吗?你可以把它作为指针或引用传递,两者都很好。当我尝试的时候,我无法在不同的类之间共享一个公共互斥体,介意发布一个简单的例子吗?你尝试了什么?您可以通过编辑将代码添加到问题中。为什么您不能“共享”互斥锁?您只需要两个类都可以访问的一个互斥变量。首先,您可以全局声明一个
std::mutex procMu
,并从两个线程中使用它。我没有尝试将其声明为全局变量,而是将其传递给