启动线程,thread,以及join、joinable、detach、类函数的线程启动
//启动线程案例
#include <thread>
#include <stdio.h>
#include <chrono>
using namespace std;
void worker(int a){
printf{"hello thread. %d\n",a);
this_thread::sleep_for(chrono::milliseconds(1000));//毫秒级等待,等待1秒钟
printf("worker done.\n");
}
class Infer{
public:
Infer(){
//Infer在实例化构造的时候会启动一个成员函数的线程
//这是通过thread 类的等号运算符重载实现的创建线程
//&Infer取地址
woker_thread_ = thread(&Infer::infer_worker,this);
}
private:
//线程中执行的就是这个内部的infer_worker函数
void infer_worker(){
//访问成员变量
this->worker_thread_;
//不用写this指针同样也能访问成员变量
worker_thread_;
}
private:
thread worker_thread_;
};
int main(){
//完整的启动线程案例
//thread t(func,args...),t的第一个参数为函数,后面的参数为这个函数的参数, 如果参数传的是引用就要用std::ref()把参数塞进去。
thread t(worker,777);//通过线程启动worker
//t.join();//等待线程结束
// 1.t.join如果不加,会在析构时提示异常,出现core dumped
// 只要线程t启动了,就必须要join
// 2.若t没有启动线程,去执行t.join会异常
// 只要线程t没有启动,一定不能join。thread t就代表没启动线程,因为此时没有要执行的函数传进去。
t.detach();//分离线程,取消管理权,使得线程成为野线程,不建议使用
//3.野线程不需要join,线程交给系统管理。程序退出后(指main函数),所有线程才退出,所以线程中函数有可能都没执行完。
if(t.joinable()) //由于前面1,2两点的原因,所以就可以写成:如果它可以join,那就join
t.join();
printf("done.\n");
return 0;
}
refer:
C++ thread用法总结(整理)
静态成员函数与非静态成员函数的区别:静态成员函数不能访问类的this指针,原因:静态函数不属于具体的对象。