在 std::thread 中以值捕获 std::shared_ptr
void ThreadTest2() {
auto sh_ptr = std::make_shared<int>(3);
std::thread td([sh_ptr](){
for (int i = 0; i < 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << *sh_ptr << std::endl;
}
});
td.detach();
std::cout << "main thread over" << std::endl;
}
在 ThreadTest2()
执行完毕后,td 线程仍然可以正常运行,直到循环 10 次正常退出。
在 std::thread 中以引用捕获 std::shared_ptr
void ThreadTest2() {
auto sh_ptr = std::make_shared<int>(3);
std::thread td([&sh_ptr](){
for (int i = 0; i < 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << *sh_ptr << std::endl;
}
});
td.detach();
std::cout << "main thread over" << std::endl;
}
在函数 ThreadTest2()
执行完毕退出后,td 线程执行到 std::cout << *sh_ptr << std::endl;
会崩溃,因为引用的形式捕获 std::shared_ptr 不会增加引用计数,函数 ThreadTest2()
执行完毕后,sh_ptr 就因为引用计数减为 0 而析构了。