多线程在 C++ 中访问 std::map

用户9359165

我正在编写一个 Minecraft 克隆,我真的想为世界生成、更新块、光传播等实现多线程。我将所有加载的块存储在哈希映射“chunk_map”中。

将互斥锁放在 chunk_map 上会破坏多线程的整个目的,因为每个线程的大部分工作都是在 chunk_map 上迭代。

如果我的想法是正确的,那么在地图中插入一个新块应该不是问题(在最坏的情况下,线程可能会跳过刚刚添加的块)但是删除一个块肯定是一个问题。

制作一个使用 shared_ptr 而不是 iterator_type 的哈希映射实现是否可以解决从映射中删除 am 元素而其他线程遍历该映射的问题?或者有什么不同的、更简单的方法?

编辑:我想避免完全同步线程,因为我不希望世界生成、块更新等限制渲染性能。

我希望主线程渲染当前加载的所有块。此外,我希望“更新程序线程”更新每个加载的块中的每个块,等等。以及“世界线程”来加载和卸载块。

阿德里安·吉维里

您可以在多个线程(使用std::packaged_task)上生成块(更新块或其他)std::async,然后使用主线程将结果复制到您的地图中。

在您的案例中,最长的部分不是地图访问,而是数据处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章