首先看一下多线程用引用传递参数的例子
#include <iostream>
#include <memory>
#include <thread>
#include <unistd.h>
struct Test
{
int32_t falg;
std::string msg;
Test()
{
printf("create\n");
}
~Test()
{
printf("delete\n");
}
};
void show(const std::shared_ptr<Test>& p1);
void test();
int main()
{
test();
getchar();
return 0;
}
void test()
{
std::shared_ptr<Test> p1 = std::make_shared<Test>();
p1->msg = "456";
p1->falg = 1;
printf("addr:%p, use_count:%d\n", p1.get(), p1.use_count());
std::thread([&]
{
show(p1);
}).detach();
}
void show(const std::shared_ptr<Test>& p1)
{
printf("addr2:%p, use_count:%d\n",p1.get(), p1.use_count());
printf("%d,%s,%s\n", p1->falg, p1->msg.c_str(), p1->msg.c_str());
}
打印输出的内容
其实p1作为一个函数的局部变量,在test函数结束之后就被销毁了,而在另外一个线程去打印了p1的引用,这时候智能指针里面指向的是个未知内容,打印出来的也不是我们所预期的值。
把代码改成值传递的方式
std::thread([=]
{
show(p1);
}).detach();
此时的打印内容
此时p1的生命周期是执行完show函数才销毁
所以尽量不要在多线程中用引用传递参数,不然会导致不可预知的异常。