【发布时间】:2019-12-03 22:46:48
【问题描述】:
我正在编写一个 Minecraft 克隆,我真的很想为世界生成、更新块、光传播等事情实现多线程。 我将所有加载的块存储在哈希映射“chunk_map”中。
在 chunk_map 上放置互斥锁会破坏多线程的全部目的,因为每个线程的大部分工作都是在 chunk_map 上迭代。
如果我的想法是正确的,在地图中插入一个新块应该没有问题(在最坏的情况下,线程可能会跳过刚刚添加的块) 但是删除一个块肯定是个问题。
创建一个使用 shared_ptr 而不是 iterator_type 的哈希映射实现是否可以解决在其他线程迭代该映射时从映射中删除 am 元素的问题? 还是有一些不同的、更简单的方法?
编辑: 我想完全避免同步线程,因为我不希望世界生成、块更新等限制渲染性能。
我希望主线程渲染当前加载的所有块。 此外,我希望“更新程序线程”更新每个加载的块中的每个块,等等。 以及加载和卸载块的“世界线程”。
【问题讨论】:
-
"在地图中插入一个新块应该没有问题"
-
@David 谢谢你的回答!我不知道,我猜这违背了使用哈希映射的目的
-
np。顺便说一句,如果没有更多上下文,很难回答您的实际问题,可能值得描述您想要实现的目标(似乎这是一个 XY 问题meta.stackexchange.com/questions/66377/what-is-the-xy-problem)
-
@David 问题已编辑。
-
只是为了确保您知道这一点:
std::map不是哈希图,而是平衡树(通常实现为红黑树)。如果您想要哈希映射,请改用std::unordered_map。
标签: c++ multithreading hashmap