分离的线程是否保持其捕获的 shared_ptr 存活?
Does a detached thread keep its captured shared_ptr alive?
如果我有一个 shared_ptr 复制到 std::thread,分离线程,然后我销毁 shared_ptr 的所有其他副本,我可以期待分离的线程继续拥有 shared_ptr 的 Live 副本?
例如,如果我有:
{
std::shared_ptr<Foo> my_foo = std::make_shared<Foo>();
std::thread soon_detached([my_foo = my_foo]() {my_foo->bar()});
soon_detached.detach();
}
我可以相信 bar()
在那种情况下调用是“安全的”吗(因为它不会尝试在正在 destructed/is 破坏的 Foo 上调用 bar 即使初始副本my_foo
的长期超出范围?
Does a detached thread keep its captured shared_ptr alive?
是的。只要线程正在执行,lambda(以及 lambda 的捕获)就会保持活动状态。同样适用于传递给 std::thread
.
的 args
we're deleting our own handle to the std::thread at the end of the scope
std::thread
对象将不包含仿函数。它将需要存储在动态内存中。执行线程的生命周期与 std::thread
包装器的生命周期是分开的。
如果我有一个 shared_ptr 复制到 std::thread,分离线程,然后我销毁 shared_ptr 的所有其他副本,我可以期待分离的线程继续拥有 shared_ptr 的 Live 副本? 例如,如果我有:
{
std::shared_ptr<Foo> my_foo = std::make_shared<Foo>();
std::thread soon_detached([my_foo = my_foo]() {my_foo->bar()});
soon_detached.detach();
}
我可以相信 bar()
在那种情况下调用是“安全的”吗(因为它不会尝试在正在 destructed/is 破坏的 Foo 上调用 bar 即使初始副本my_foo
的长期超出范围?
Does a detached thread keep its captured shared_ptr alive?
是的。只要线程正在执行,lambda(以及 lambda 的捕获)就会保持活动状态。同样适用于传递给 std::thread
.
args
we're deleting our own handle to the std::thread at the end of the scope
std::thread
对象将不包含仿函数。它将需要存储在动态内存中。执行线程的生命周期与 std::thread
包装器的生命周期是分开的。