【发布时间】:2014-02-03 18:29:37
【问题描述】:
我有一个相当复杂的场景,所以我试图将其提炼为基本问题。
我有 3 个类(这里简化了):
class Base {
protected:
std::map <unsigned int, Node*> nodes;
}
class Node {
protected:
std::map <unsigned int, Leaf*> leaves;
}
class Leaf {
protected:
myDataStruct myData;
}
这些类代表一个 3 级树,由一个基、std::map<int,ptr*> 中的一些中间节点和每个节点的一些叶子组成,也作为 std::map<int,ptr*>。此树在更新线程中动态生成和更新。
我有另一个线程从这些节点渲染数据,其速度比更新慢得多,因此我更喜欢将更新操作与渲染分开。我也不会在渲染线程的每个循环上渲染所有数据。
我最初的想法是通过调用存储指向叶子中数据的指针的函数来注册我想从叶子中渲染数据:
void MyRenderClass::registerData(int* dataPointer) {
// store dataPointer in MyRenderClass
myStoredDataPointer = dataPointer;
}
然后在渲染线程循环期间,我使用该数据指针来渲染数据。
所以,问题是:这样安全吗?我可以通过在各自的析构函数中取消注册数据来处理叶或节点被删除的情况。我真正想知道的是,该指针是否会在树更新以及添加新节点和叶子时保持不变? std::map 是否会在修改时重新排列或移动指针?
在相关说明中,我可以安全地将指向父节点/基的指针存储在叶/节点中,以便我可以从叶->基遍历树吗?
我希望这是有道理的。起初我认为这似乎没问题,但我想在进一步走这条路之前进行验证。这个例子有点做作,因为整个代码库太大而无法理解。
【问题讨论】:
标签: c++ multithreading pointers stdmap