C++多线程Linux多线程服务端编程使用muduo C++网络库:用shared_ptr解决并发编程中的内存问题

本文介绍了C++中使用shared_ptr解决并发编程中的内存问题,包括避免空悬指针、内存泄漏和线程安全问题。讨论了shared_ptr的线程安全特性,传递shared_ptr的策略,以及如何处理析构动作和避免循环引用。还提到了通过继承enable_shared_from_this来获取shared_ptr的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++里可能出现的内存问题:

  1. 缓冲区溢出 : 用 vector 或 string 管理缓冲区,并通过成员函数而不是裸指针修改缓冲区
  2. 空悬指针/野指针:用 shar_ptr / weak_ptr
  3. 重复释放:用 scoped_ptr,只在对象析构的时候释放一次
  4. 内存泄漏:用 scoped_ptr,对象析构的时候自动释放内存
  5. 不配对的new[]/delete:把 new[] 通通换为 vector / scoped_array
  6. 内存碎片
shared_ptr用法小结
  1. 意外延长对象的生命周期
    使用 bind 绑定了一个 share_ptr指向的一个函数或成员函数

  2. 线程安全问题

  • 不同的shared_ptr即使绑定了相同的对象也是线程安全的
  • 对同一shared_ptr任何操作线程不安全
  1. 传递shared_ptr对象的技巧
    shared_ptr< T >p;
  • 若直接传递 f ( p ) ,由于线程安全问题,传递之前要加锁,但由于是同步调用过程,加锁后要等调用函数执行完再解锁,这样的效率太低
  • 可以先加锁对 shared_ptr 拷贝后解锁,传递拷贝后的值,利用const &接收,减少一次拷贝(因为shared_ptr的拷贝需要改变引用计数,导致拷贝的代价要比普通指针高,所以尽量不拷贝)
  1. 析构动作在创建时捕获
    对象的析构是同步的,当最后一个指向 x 的 shared_ptr 离开其作用域的时候,x 会同时在同一个线程析构,这个线程不一定是对象诞生的线程。
Linux多线程服务端编程使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值