0 点赞 评论 收藏
分享
阿巴阿巴_56:面试官不问那些,我怎么进去?
0 点赞 评论 收藏
分享
: 顺便我来试着强行回答一下最后一节(评论留言只给 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 是否了解?主要用于什么场景?
- 读写锁,用于多个读者需要并发读取数据的情况。
0 点赞 评论 收藏
分享
关注他的用户也关注了: