【学习总结】C++11多线程传值

多线程传值
一:传递临时对象作为线程参数
    1.1 要避免的陷阱--
        在对线程函数传值的时候,存在一种情况,当主线程执行完毕后,如果子线程还在执行,可能导致局部变量失效
        导致线程对内存非法引用问题;
    1.2 要避免的陷阱--
        在传递参数的时候,使用类对象并且避免隐式类型转换,最好是在创建线程的时候构建出临时对象,在函数里面
        采用引用的方式;
        疑问:我需要传递类型相同的参数时,怎么办?
    1.3 总结--
        最好是在创建线程的时候构造临时对象传值,避免使用原始指针;

二:线程id的概念
    id是一个数字,每个线程(不管是主线程还是子线程)实际上都对应着一个数字,不同的线程,他的线程id必然是不同的;
        线程id可以用C++标准库里面的函数来获取--
            std::this_thread::get_id();

三:类对象、智能指针作为线程参数
    3.1 类对象
        传递类对象的时候,在一般情况下,修改的值不会影响到main()函数;
        当值传递到子线程中去的时候,子线程会申请一个新的内存空间;
        如果需要修改的值影响main()函数,那么可以使用标准库函数中的std::ref()函数;
        eg:std::thread m(func,std::ref(value));
        std::ref()函数是一个引用;不调用拷贝函数;
    3.2 智能指针
        使用智能指针传值的时候,需要使用标准库函数中的std::move()函数;
        eg:void func(unique_ptr<int> pzn){ //.... }
            unique_ptr<int> myf(new int(100));
            thread m(func,std::move(myf));
        即,实参myf和形参pzn的内存地址是一样的;
        使用std::move()函数后 myf为空;

四:成员函数指针作为线程函数
    4.1 使用一个类的成员函数作为子线程的入口;
        A m(10);
        std::thread m(&A::thread_work, m,15);    ps: &m == std::ref(m)
        m.join();

注:菜鸟学习,多多指教~

猜你喜欢

转载自blog.csdn.net/qq_40458825/article/details/88956161