注意点:
1、传递空间已销毁
2、多线程共享一块内存
3、传递的指针变量的生命周期小于线程
#include <iostream>
#include <thread>
#include <string>
#include <unistd.h>using namespace std;class Para
{public:Para(){cout<<"Create Para"<<endl;}Para(const Para& p){cout<<"copy para"<<endl;}void func1(){cout<<"here is consturct Para";}~Para(){cout<<"drop Para"<<endl;}string name;
};void ThreadMain(int p1,float p2,string str)
{// sleep(0.2);cout<<"ThreasMain = "<<p1<<" "<<p2<<" "<<str<<""<<endl;
}void ThreadMainPtr(Para* p)
{// sleep(2);cout<<"ThreadMainPtr = "<< p->name <<endl;
}void ThreadMainRef(Para& p)
{sleep(2);cout<<"ThreadMainPtr = "<< p.name <<endl;
}int main(int argc,char* argv[])
{// {// //传递引用// Para p;// p.name = "test P_name Ref";// thread Th(ThreadMainRef, ref(p)); //传递引用的时候要使用ref()标识传递的是引用// Th.join();// cout<<"执行到了第一段代码末尾"<<endl;// }{//传递指针//使用栈内存,随着主进程的结束,内存被释放//错误示范,detach之后,不等子线程结束,主线程已经结束了,所以Para p的对象早已经被释放了,所以传进去的P.name是空的。Para p;p.name = "test P_name Ptr";thread Th(ThreadMainPtr, &p); //传递指针,必须加上取地址符,意味着传的是地址,即指针//这里是我随便做了尝试,验证不同内存分区//使用new开辟一段堆内存,和使用栈内存不一样,堆内存在主线程结束后还存在,需要程序员使用delete手动释放//在第一次执行的时候,主进程结束了,堆内存刚写进去,所以在第一次执行的时候p->name不能显示,如果不delete,在第二次执行的时候,会显示出来。// Para *p;// p = new Para;// p->name = "zhangyaozu";// thread Th(ThreadMainPtr, p);Th.detach();cout<<"执行到了第一段代码末尾"<<endl;// delete p;}// // {//传递指针,正确做法使用join,等待子线程运行结束// Para p;// p.name = "test P_name";// thread Th(ThreadMainPtr, &p);// Th.join();// getchar();// }// {// float f = 15.02;// thread th(ThreadMain,15,f,"test one");// th.join();// }// sleep(0.2);return 0;
};