注意点:
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;
};