在SLAM当中,会涉及到多线程的问题。
想来,大型的项目,也大都会用到多个线程进行管理。
C++中,想要创建多个线程,需要引入头文件。
#include<thread>
浅显的理解,创建多线程的过程:
①定义一个线程函数
void T1(){
//函数内容
}
②定义线程对象 std::thread 线程对象(线程函数);
std::thread t(T1);
③当线程创建成功并执行线程函数后,一定要保证线程函数运行结束才能退出,调用了join()
函数阻塞线程,直到线程函数
运行结束,回收对应创建线程的资源。当然还要另一种方式,叫做detach(),这种方式会使线程对象和线程函数分离,不易于观察线程什么时候结束。
t.join();
每个线程都有自己的线程标识,也就是线程ID,当线程创建成功后,可以通过get_id()
来获取线程的ID。
为了进行线程资源之间的管理,常常会用到mutex进行约束。最常用的方式就是lock和unlock。在VINS当中就是采用的这种方式进行管理。可以举个例子:
std::mutex msg_buf;
void fuc(){
msg_buf.lock; //加锁
//…执行
msg_buf.unlock; //解锁
}
int main(){
……
}
此外还可以利用chrono令线程睡眠等等。
最后附上自己写的一个小例子。
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include "canshu.h"
using namespace std;
std::mutex msg_buf;
void Process(){
msg_buf.lock();
cout<< "线程开启\n";
if(STEREO)
{
cout<<"这是双目模式\n";
}
else
{
cout<< "这是单目模式\n";
}
cout << "让我们等待2秒\n";
std::this_thread::sleep_for(std::chrono::seconds(2));
cout<<"等待结束\n";
cout <<"来看看这个线程的id";
cout <<"ID: " <<std::this_thread::get_id()<<" \n";
cout <<"结束这个线程\n";
msg_buf.unlock();
}
int main() {
std::thread t1(Process);
std::thread t2(Process);
t1.join();
t2.join();
return 0;
}