C++多线程-传递普通变量,指针,引用给线程

注意点:

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;
};

猜你喜欢

转载自blog.csdn.net/qq_39333636/article/details/134701926