当前位置: 首页 > news >正文

智能指针是线程安全的吗?

很遗憾,使用不当的时候并不是。

#include <iostream>
#include <memory>
#include <thread>
#include <chrono>

struct Foo
{
    Foo(int i):i_(i){}
    void print() {std::cout << i_ << std::endl;}
    int i_;
};

int main(int argc, char const *argv[])
{
    {
        auto shptr = std::make_shared<Foo>(42);
        std::thread([&shptr](){
            std::this_thread::sleep_for(std::chrono::seconds(1));
            shptr->print();
        }).detach();
    }
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return 0;
}
// g++ test.cpp -o test -lpthread
// ./test 
// Segmentation fault

当我们向另一个线程传递智能指针的引用时,由于use count并没有加1,在shptr析构时直接销毁了管理的Foo实例,所以在线程中执行shptr->print()会引发coredump。
修改起来也很简单,把std::thread(&shptr改成std::thread(shptr即可。记住,智能指针尽量不要传引用。

知道在释放资源的时候shread_ptr和unique_ptr有什么不同吗?

这里需要在shared_ptr构造时传入deleter,用来销毁持有的数组,而unique_ptr无需此操作,因为unique_ptr重载了unique_ptr(T[])。

get_foo()方法为什么不直接返回this指针?

参考 ”为什么尽量不要使用裸指针初始化智能指针“。聪明的小伙伴,想想如果多次调用get_foo()会发生什么?

相关文章:

  • 网络协议相关问题
  • 【中间件开发】kafka使用场景与设计原理
  • 第1章大型互联网公司的基础架构——1.12 多机房:主备机房
  • 岛屿问题(dfs)
  • 首届电视剧制作产业大会龚宇受瞩目,河南郑州(短剧)黄帝影视城盛情相邀
  • 微信小程序模仿快播标签云滚动特效
  • 1.16作业
  • ASUS/华硕幻15 GU502G 原厂Win10系统 工厂文件 带ASUS Recovery恢复
  • 重构建筑未来:中建海龙MiC建筑技术开启智慧建造新篇章
  • 网络运维学习笔记 013网工初级(HCIA-Datacom与CCNA-EI)DHCP动态主机配置协议(此处只讲华为)
  • 第4章 信息系统架构(五)
  • MyBatis配置
  • 面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
  • 网络安全-js安全知识点与XSS常用payloads
  • 树与并查集,区间dp,树形dp
  • 2025.2.23机器学习笔记:PINN文献阅读
  • 【react18】如何使用useReducer和useContext来实现一个todoList功能
  • 通过Selenium实现UI自动化校验输入的数据是否完整有效方式
  • Unity Mixamo模型更好的适配角色模型
  • 【Gin-Web】Bluebell社区项目梳理2:JWT-Token认证
  • 怎么在一个网站做编辑/seo是什么服
  • 遵义相亲群/太原seo排名收费
  • 网站建设查询/做seo网页价格
  • 山东淄博网站建设/河北百度seo
  • 单位做网站注意什么问题/2021年关键词排名
  • 黑龙江省城乡建设厅网站/淘宝排名查询