首先看如下一段代码
void myPrint(string& a)
{
cout << a << endl;
}
int main(void)
{
char buffer[] = "Hello Word!";
thread A(myPrint, buffer);
A.detach();
return 0;
}
上述这段代码中,会有这个问题。。
给A传入的第二个参数是一个buffer。。需要发生隐式转换,即从char[]到string。。。但这种转换有可能会在主线程执行完毕后再进行。。这会导致A线程实际
复制的参数是一段不存在的内存,会导致未定义的错误。
所以我们需要改进main函数代码
int main(void)
{
char buffer = "Hello Word!";
thread A(myPrint, string(buffer)); //直接在主线程中利用string的构造函数构造出临时变量
A.detach;
return 0;
}
上述这种方式中,就可以保证在主线程结束(即buffer内存还有效之前),A线程肯定会复制一片和buffer内容相同的内存,然后让A线程中myPrint的第二个参数
绑定到这片内存上,这样就保证了线程安全。