1. 程式人生 > >ORB-SLAM2中的C++技巧(一)

ORB-SLAM2中的C++技巧(一)

打算好好啃ORB-SLAM原始碼,接下來的LSD、SVO其實就是從特徵點法換成了光流法(直接法),但是整體的框架大同小異,所以打算兩週時間啃完,並將學習到的C++技巧總結下來,這樣對於C++也會有新的理解。

每章5個技巧,怕什麼真理無窮,進一寸有進一寸的歡喜。


一、多執行緒Thread

併發:某一個時刻只能處理一個操作,但是交替進行。大腦的設計:看顯示器同時打字

並行:某個時間點上處理兩個或以上的操作。

例項程式碼:

#include <iostream>
#include <thread>
using namespace std;

void t1()
{
    for (int i = 0; i < 20; ++i)
    {
        cout << "t1111\n";
    }
}
void t2()
{
    for (int i = 0; i < 20; ++i)
    {
        cout << "t22222\n";
    }
}
int main()
{
    thread th1(t1);//新執行緒要有初始函式
    thread th2(t2);
    
    th1.join(); //等待th1執行完
    th2.join(); //等待th2執行完

    cout << "here is main\n\n";

    return 0;
}

 

(1)三個執行緒,一個主執行緒(main),兩個子執行緒(th1,th2),三者併發執行,共用CPU。

(2)join的作用是保證子程式執行結束再退出主執行緒,this is main最後才執行。否則會出Bug。


二、unique_lock與lock_guard關係

多執行緒程式設計會對共享的資料進行防寫,防止多執行緒對共享資料成員進行讀寫時造成資源爭搶,做法:加鎖—mutex

unique_lock與lock_guard兩種資料結構實現自動unlock,unique_lock更靈活但佔用空間。

mutex是用來保證執行緒同步的,防止不同的執行緒同時操作同一個共享資料。

         lock_guard能夠自解鎖,當生命週期結束時,它會自動析構(unlock),

               mutex   m;

               lock_guard<mutex>  lockGuard(m);