将数组(float)复制到本地数组(float)的最佳方法

时间:2015-03-13 15:48:47

标签: c++ arrays

好的,所以我有一个不断更新的结构。

现在我需要在某处本地使用其中的一些变量,而不会在它们之间进行更改。

我首先这样做是为了让它们在本地获得,这显然不是最好的方法,但它有效。

float MyFloatArray[3];
MyFloatArray[0] = otherThread()->floatArray[0];
MyFloatArray[1] = otherThread()->floatArray[1];
MyFloatArray[2] = otherThread()->floatArray[2];

现在我想知道是否有更好的方法来做到这一点。

我已经尝试了以下内容:

float MyFloatArray = otherThread()->floatArray;
float* MyFloatArray = otherThread()->floatArray; //Works but updates the otherThread array(Obviously) but that shouldn't happen

由于我有一个体面的大项目,所以要将所有这些更新为std::array<float,3>

需要付出很多努力。

还有其他选择吗?否则我会将我的所有浮点数组更新为std::array<float,3>,因为如果没有替代方案,它会更清洁。

2 个答案:

答案 0 :(得分:6)

您可以简单地调用std::copy,确保副本受到mutex等同步机制的保护。例如:

std::mutex m; // otherThread() must lock this mutex when modifying array

{
  std::lock_guard<std::mutex> lock(m);
  std::copy(otherThread()->floatArray, otherThread()->floatArray + 3, MyLoatArray);
}

或使用可复制的类型,例如std::array<float, 3>并使用赋值。同样,必须使用同步机制保护它:

std::mutex m; // otherThread() must lock this mutex when modifying array

{
  std::lock_guard<std::mutex> lock(m);
  MyFloatArray = otherThread()->floatArray;
}

答案 1 :(得分:2)

您需要的是原子复制操作。不幸的是,整个结构都不存在这种情况,因此在复制操作期间,您必须使用互斥锁来锁定对结构的访问(在另一个线程中,持续时间)对结构的修改)。

然后你可以坚持使用元素分配,或者切换到std::copy;这并不重要。从根本上说,后者仍然会编译成元素分配。无论您使用什么语法,您的CPU仍然必须复制一系列字节,并且它不能在单个原子操作中执行此操作。但只要您对结构的读写操作受到互斥锁的保护,您就可以了。