好的,所以我有一个不断更新的结构。
现在我需要在某处本地使用其中的一些变量,而不会在它们之间进行更改。
我首先这样做是为了让它们在本地获得,这显然不是最好的方法,但它有效。
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>
,因为如果没有替代方案,它会更清洁。
答案 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仍然必须复制一系列字节,并且它不能在单个原子操作中执行此操作。但只要您对结构的读写操作受到互斥锁的保护,您就可以了。