1、传递临时对象作为线程参数
#include<iostream>#include<thread>using namespace std;void myPrint(const int& i, char* pmyBuf){cout << i << endl;cout << pmyBuf << endl;}int main(){int mvar = 1;int& mvary = mvar;char mybuf[] = "this is a test!";thread mytobj(myPrint, mvar, mybuf);mytobj.detach();return 0;}
根据debug分析,myPrint中的i并不是mvar的引用,实际是值传递。所以,即便主线程detach了子线程,那么子线程中用的i值仍然是安全的。
但是myPrint的第二个参数指针指向的是同一个地址,因此在detach时,主线程结束了,mybuf的内存被回收了,因此会报错。所以,线程的值传递不建议传递指针,同时也不建议传递引用。
#include<iostream>#include<thread>#include<string>using namespace std;void myPrint(const int& i, const string& pmyBuf){cout << i << endl;cout << pmyBuf << endl;}int main(){int mvar = 1;int& mvary = mvar;char mybuf[] = "this is a test!";//thread mytobj(myPrint, mvar, mybuf); 不稳定thread mytobj(myPrint, mvar, string(mybuf));mytobj.detach();return 0;}
事实上是存在,mybuf都被回收了,系统采用mybuf去转string。因此要在给线程传参是创建一个临时的string对象。
