c++ - 分离线程是否使其捕获的shared_ptr保持事件状态?

标签 c++ multithreading memory shared-ptr smart-pointers

如果我将一个shared_ptr复制到std::thread中,分离该线程,然后销毁该shared_ptr的所有其他拷贝,我可以期望分离的线程继续拥有shared_ptr的实时拷贝吗? 例如,如果我有:

{
    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() 在这种情况下调用是“安全”的吗(因为它不会尝试在正在被破坏/被破坏的 Foo 上调用 bar,即使最初的my_foo 的拷贝超出了范围?

最佳答案

Does a detached thread keep its captured shared_ptr alive?

是的。只要线程正在执行,lambda 以及 lambda 的捕获就会保持事件状态。同样的情况也适用于传递到 std::threadargs

we're deleting our own handle to the std::thread at the end of the scope

std::thread 对象不会包含仿函数。它将需要存储在动态内存中。执行线程的生命周期与 std::thread 包装器的生命周期是分开的。

关于c++ - 分离线程是否使其捕获的shared_ptr保持事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67928979/

相关文章:

c++ - 不能只删除方法的 const 重载吗?

python - 在 PyQt5 中停止工作线程中的无限循环最简单的方法

c - 按字典顺序返回内存字符对用户输入进行排序?

java - 如果 Java 应用程序出现内存泄漏,JVM 最终会耗尽内存并标记,对吗?

c++ - 需要解决限制 : abstract class cannot be used for return types

c++ - 如何获取char数组的列数?

c# - 委派给 GUI 时避免主线程锁定

java - AsyncHttpClient 创建了太多 AsyncHttpClient 计时器线程

c - 为什么 GDB 在到达 `main` 之前不能解析这个符号?为什么 valgrind 根本无法解决它?

c++ - QT中有类似GTK Headerbars的东西吗?