前言
ORB-SLAM2以高效的多线程结构闻名。其运用到的C++多线程方法相对来说还是比较基础的,今天总结一下其源码中的多线程编程方法。
一、线程创建
thread类是C++标准库中的一个类,可以创建独立运行的线程。
执行线程是一个指令序列,它可以在多线程环境中与其他这样的序列同时执行,同时多个线程之间可以共享相同的地址空间。
在ORB-SLAM2中创建线程的代码为:
//初始化局部建图线程并运行
//Initialize the Local Mapping thread and launch
mpLocalMapper = new LocalMapping(mpMap,
mSensor==MONOCULAR);
//运行这个局部建图线程
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run, //这个线程会调用的函数
mpLocalMapper); //这个调用函数所在的类
//Initialize the Loop Closing thread and launchiomanip
mpLoopCloser = new LoopClosing(mpMap,
mpKeyFrameDatabase,
mpVocabulary,
mSensor!=MONOCULAR);
//创建回环检测线程
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, //线程的主函数
mpLoopCloser); //该函数所在的类
//Initialize the Viewer thread and launch
if(bUseViewer)
{
mpViewer = new Viewer(this,
mpFrameDrawer,
mpMapDrawer,
mpTracker,
strSettingsFile);
//新建viewer线程
mptViewer = new thread(&Viewer::Run, mpViewer);
mpTracker->SetViewer(mpViewer);
}
二、mutex互斥锁
为了实现线程之间的交流,需要用到互斥锁。做到在多个线程同时对一个内存空间操作的时候,保证线程安全。
c++标准库中的mutex类是一种可锁定的对象,它被设计用来在关键代码段需要独占访问时发出信号,以防止具有相同保护的其他线程并发执行和访问相同的内存位置。
为了解释其作用,可以看以下这段代码:
首先看一下没有加锁的效果:
#include <iostream><