[英]How to use shared_mutex for objects in std::vector elements
我目前正在开发一款游戏。 在这个游戏中,某种类型的“游戏对象”存储在 std::vector 中。 这些对象的更新(游戏)代码在一个线程上执行,而渲染由主线程处理。
这些“游戏对象”的向量通过引用传递给处理它们的更新代码的线程,以便在线程之间共享数据。 因此,需要某种形式的线程安全以防止渲染代码尝试访问正在被更新代码修改的内存(这会导致崩溃)。
理想情况下,我想使用 shared_mutex 作为存储在所述向量中的这些“游戏对象”的一部分。 但是,这不会编译并导致错误。 我的理解是,这是因为不能复制互斥锁。
有没有一种方法可以解决这个问题,既高效又安全,而且“不是噩梦”?
我看到的唯一可行的解决方案是防止每种特定类型的对象同时更新和渲染。 然而,这会在某种程度上抵消多线程的好处。 我估计超过 80% 的游戏将处理一种单一类型的对象。
main(){
std::vector<Enemies> enemies;
std::thread(update_thread, std::ref(enemies), ... , ...);
while(true){
render_player();
render_enemies();
render_physics();
flip_to_display()
}
};
update_thread(std::vector<Enemies> &enemies, ... , ...){
while(true){
update_player();
update_enemies();
update_physics();
}
};
render_enemies(){
for(all enemies)
enemy.render();
}
update_enemies(){
for(all enemies)
enemy.update();
}
class Enemies{
//Would be nice to have the below, but afaik, not possible
std::shared_mutex mutex;
update(){
std::shared_lock<std::shared_mutex> lock(mutex);
//Write and Access data from enemy
}
render(){
std::shared_lock<std::shared_mutex> lock_shared(mutex);
//Only Access some data from enemy and draw it
}
}
注意:我使用的是 Visual Studio 2015,所以我只能使用 C++14(ish) 兼容功能。
根据评论中提供的答案,我认为我最好的选择是找到一个更具创造性的解决方案,完全回避这个问题。 在这种情况下,我可能会提前处理并将结果写入缓冲区。 这种方式渲染和处理应该在设计上避免任何冲突,从而避免对锁定条件的需要。
如果我记得,这很可能会成为公认的解决方案(因为 2 天内无法按下按钮)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.