ORB-SLAM2中的C++技巧(一)
阿新 • • 發佈:2018-11-15
打算好好啃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);