C++并发多线程--临时对象的使用

1--传递临时对象作为线程参数

当使用 detach() 分离线程时,传递参数应注意以下问题:

        (1)传递 int 等简单类型参数时,建议使用值传递,而不使用引用传递,避免参数回收的问题(主线程首先结束,引用传递的参数被回收了,导致子线程的参数无效);

        (2)当传递复杂类型参数时(如类等),应避免发生隐式类型转换(发生隐式类型转换时,可能会发生主线程结束了,要传递的参数还没进行隐式类型转换,而此时参数已经被回收了),可通过生成临时对象的方式(例如下面代码中的 std::string(s) 和

class(value)都在主线程中首先生成临时对象,再进行参数传递)来进行参数传递,同时在函数参数内用引用(例如 myprint 函数中 const myclass &cls)进行接收;

        

非必要情况,应尽量避免使用 detach() 来分离线程;

#include 
#include 
#include 

class myclass{
public:
    int value;
    myclass(int v):value(v){std::cout << "value: " << value << std::endl;};
};

void myprint(const int i, const std::string &str, const myclass &cls){
    std::cout << "i: " << i << std::endl;
    std::cout << "str: " << str << std::endl;
}   

int main(){
    int idx = 10;
    std::string s = "ABC";
    int value = 5;
    std::thread thread1(myprint, idx, std::string(s), myclass(value));
    thread1.detach();

    return 0;
}

2--

你可能感兴趣的:(多线程并发学习笔记,c++)