参考1:
#include <thread>
#include <iostream>
class Wrapper
{
public:
void member1()
{
std::cout << "i am member1" << std::endl;
}
void member2(const char *arg1, unsigned arg2)
{
std::cout << "i am member2 and my first arg is (" << arg1 << ") and second arg is (" << arg2 << ")" << std::endl;
}
std::thread member1Thread()
{
return std::thread(&Wrapper::member1, this);
}
std::thread member2Thread(const char *arg1, unsigned arg2)
{
return std::thread(&Wrapper::member2, this, arg1, arg2);
}
};
int main()
{
Wrapper *w = new Wrapper();
std::thread tw1 = w->member1Thread();
tw1.join();
w->member2Thread("hello", 100).detach();
return 0;
}
join()为主线程等待子线程的阻塞模式
detach()为主线程不管子线程的非阻塞模式
参考2:
①创建一个类,并编写圆括号重载函数,初始化一个该类的对象,把该对象作为线程入口地址
class Ta
{
public:
void operator()()
{
cout << "我的线程开始运行" << endl;
//-------------
//-------------
cout << "我的线程运行完毕" << endl;
}
};
//main函数里的:
Ta ta;
thread myThread(ta);
myThread.join();
②lambda表达式创建线程
//main函数中
auto lambdaThread = [] {
cout << "我的线程开始执行了" << endl;
//-------------
//-------------
cout << "我的线程开始执行了" << endl;
};
thread myThread(lambdaThread);
myThread.join();
③把某个类中的某个函数作为线程的入口地址
class Data_
{
public:
void GetMsg(){}
void SaveMsh(){}
};
//main函数里
Data_ s;
//第一个&意思是取址,第二个&意思是引用,相当于std::ref(s)
//thread oneobj(&Data_::SaveMsh,s)传值也是可以的
//在其他的构造函数中&obj是不会代表引用的,会被当成取地址
//调用方式:对象成员函数地址,类实例,[成员函数参数]
//第二个参数可以传递对象s,也可以传递引用std::ref(s)或&s
//传递s,会调用拷贝构造函数在子线程中生成一个新的对象
//传递&,子线程中还是用的原来的对象,所以就不能detach,因为主线程运行完毕会把该对象释放掉
thread oneobj(&Data_::SaveMsh,&s);
thread twoobj(&Data_::GetMsg,&s);
oneobj.join();
twoobj.join();