C++11之后有了标准的线程库,std::thread,通过创建一个thread对象来管理c++程序中的多线程。
通常会看到pthread,这是linux下c++线程库,提供一些线程的操作,偏向底层。对于多线程必须明白线程安全、线程同步和互斥关系、线程如何通信、与进程间的关系等,否则会陷入以下迷茫:
(1)程序死锁,不响应
(2)执行结果达不到预期
(3)多线程性能并无提升执行效率
(4)理不清程序执行流程
(5)不知道如何调试,同上
今天的案例是在进行LeGo-LOAM中地图优化代码阅读时,对于多线程的程序执行问题的疑问,通过模仿地图优化执行写了以下demo,希望能够帮助自己理解多线程的程序执行问题。
#include<iostream>
#include<thread>
#include<string>
using namespace std;
class CTest
{
public:
CTest(){cout<<"000"<<endl;}
int tstart(const string& tname)
{
cout<<"thread t1!"<<tname<<endl;
return 0;
}
int tend(const string& tname)
{
cout<<"thread t2!"<<tname<<endl;
return 0;
}
int run (int j)
{
cout<<"run"<<j<<endl;
return 0;
}
};
int main()
{
CTest obj;
/*关于参数的说明:
参数1类型为成员函数的函数指针
参数2类型为指向该类型的实例的指针
参数3为传入的函数参数
*/
thread t1(&CTest::tstart,&obj,"111");//参数1:线程函数,
thread t2(&CTest::tend,&obj,"222");
for(int i=0;i<5;i++)
{
obj.run(i);
}
//join线程,调用该函数会阻塞当前线程,知道*this所标识的线程执行完毕,join才返回
t1.join();
t2.join();
cout<<"Main function!"<<endl;
return 0;
}
程序执行结果:
000
run0
run1
run2
run3
run4
thread t1!111
thread t2!222
Main function!
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(test1)
set(CMAKE_BUILD_TYPE "-Release")
add_compile_options(-std=c++11 -g -Wall)
add_executable(test1 test1.cpp)
target_link_libraries(test1 pthread)