ORB-SLAM2多线程用法总结


前言

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><
  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值