1、问题
最近调试 orbslam3
需要反反复复把它启动退出,发现 orbslam3
在未真正创建地图(空地图)的时候,按 ctrl+c
将其退出时,会卡死无法 shutdown
退出,只能关闭终端窗口来结束进程。
2、排查
- 通过增加打印,定位到是卡在
Atlas.cc
文件Atlas::GetAllKeyFrames()
函数的lock
语句。
std::vector<KeyFrame*> Atlas::GetAllKeyFrames() {
unique_lock<mutex> lock(mMutexAtlas); // <<<<< 卡在这里
return mpCurrentMap->GetAllKeyFrames();
}
- 咨询
ChatGPT
orbslam3 中 Atlas::GetAllKeyFrames() 函数以下语句在 KeyFrames 为空时无法执行完成,如何解决?
unique_lock<mutex> lock(mMutexAtlas);
ChatGPT
回答
在 ORB-SLAM3 中,Atlas::GetAllKeyFrames() 函数是用来获取 Atlas 中所有关键帧的函数。
在函数内部,使用了一个互斥量 mMutexAtlas 来确保对 Atlas 中关键帧的访问是线程安全的。
然而,如果 Atlas 中没有关键帧,这个互斥量就会造成死锁,因为它无法被解锁。
为了解决这个问题,可以在进入互斥量之前,先检查是否存在关键帧。
3、解决
- 根据
ChatGPT
的回答,修改Atlas.cc
文件Atlas::GetAllKeyFrames()
函数为以下内容
std::vector<KeyFrame*> Atlas::GetAllKeyFrames() {
if (mpCurrentMap->KeyFramesInMap() == 0) {
printf("--- mpCurrentMap->KeyFramesInMap() == 0 ---\n");
return mpCurrentMap->GetAllKeyFrames();
}
unique_lock<mutex> lock(mMutexAtlas);
return mpCurrentMap->GetAllKeyFrames();
}
- 然后重新编译
orbslam3
后即可正常在空地图时退出。