顺便我来试着强行回答一下最后一节(评论留言只给 1000 字很讨厌) 说一下 C++ 提供的智能指针?各自有什么用途 - 本问题太宽泛了,暂略 shared_ptr 的基本数据结构可以讲讲么? - 分两层,sp 直接成员是 ① 对象指针 ② 控制块指针。控制块主要包含 ① 被管理的对象 (或指针),② deleter、③ allocator、④ shared 引用计数、⑤ weak 引用计数。 make_shared 和构造函数传裸指针的区别? - 两点。首先标准建议 make_shared 同时申请控制块与对象的内存 (直观可减少一次内存申请);其次是异常安全,C++17 之前形如 f(sp(new A), g()) 的执行顺序可能是 new A、g()、sp(),一旦 g() 中发生异常,那么 new A 将无法被回收,使用 make_shared 可以避免。 shared_ptr 是否是线程安全的?或者说哪些部分是线程安全的? - 前问提到的“控制块”是线程安全的。 那引用计数的线程安全性怎么实现的(可能一般人说原子类型)? - 看情况,比如 libstdc++ 的文档提到他们的 sp 有三种模式:不保证并发安全、cas、mutex。 如果有一个场景需要用到线程安全的 shared_ptr,一般你会怎么做? - 本问题太开放了,需要根据上下文作答,暂略。 说到线程安全性,在语言层面,你一般使用什么手段? - 主要借助各种同步原语,或者一开始从设计上消除 data race。 如何在代码角度来避免死锁呢?是否用过相关的API?原理了解吗? - 可以参考 C++ Concurrency in Action 这本书,里面有些建议。比如保证平时加锁的顺序是“嵌套”的,又比如使用 std::lock 等自带死锁避免算法的加锁方式。原理我也不了解。 C++ 提供的 shared_mutex 是否了解?主要用于什么场景? - 读写锁,用于多个读者需要并发读取数据的情况。
7 5

相关推荐

永不遗忘:才这么点算什么拉黑,我初筛连着挂几十次了,最后还是能进面
点赞 评论 收藏
分享
03-26 15:18
已编辑
华北水利水电大学 Java
点赞 评论 收藏
分享
正在热议
更多
牛客网
牛客企业服务