c++ 多线程编程 笔记

24 篇文章 1 订阅

1、

空悬指针(dangling pointer)指向已经销毁的对象或已经回收的地址,

野指针(wild pointer)指的是未经初始化的指针

2、在面向对象程序设计中,对象的关系主要有三种composition、aggregation、association。

composition(组合/复合)关系在多线程里不会遇到什么麻烦,因为对象x 的生命期由其唯一的拥有者owner 控制,owner 析构的时候会把x 也析构掉。从形式上看,x 是owner 的直接数据成员,或者scoped_ptr 成员,抑或owner 持有的容器的元素。

后两种关系在C++ 里比较难办, 处理不好就会造成内存泄漏或重复释放。

association(关联/联系)是一种很宽泛的关系,它表示一个对象a 用到了另一个对象b,调用了后者的成员函数。从代码形式上看,a 持有b 的指针(或引用),但是b的生命期不由a 单独控制。

aggregation(聚合)关系从形式上看与association 相同,除了a 和b 有逻辑上的整体与部分关系。如果b 是动态创建的并在整个程序结束前有可能被释放,那么就会出现§1.1 谈到的竞态条件。

3、shared_ptr/weak_ptr

shared_ptr是引用计数型智能指针,在Boost 和std::tr1 里均提供,也被纳入C++11 标准库,现代主流的C++ 编译器都能很好地支持。shared_ptr<T> 是一个类模板(class template),它只有一个类型参数,使用起来很方便。引用计数是自动化资源管理的常用手法,当引用计数降为0 时,对象(资源)即被销毁。

weak_ptr也是一个引用计数型智能指针,但是它不增加对象的引用次数,即弱(weak)引用

 

shared_ptr控制对象的生命期。shared_ptr 是强引用(想象成用铁丝绑住堆上的对象),只要有一个指向x 对象的shared_ptr 存在,该x 对象就不会析构。当指向对象x 的最后一个shared_ptr 析构或reset() 的时候,x 保证会被销毁。
• weak_ptr 不控制对象的生命期,但是它知道对象是否还活着(想象成用棉线轻轻拴住堆上的对象)。如果对象还活着,那么它可以提升(promote)为有效的shared_ptr;如果对象已经死了,提升会失败,返回一个空的shared_ptr。“提升/lock()”行为是线程安全的。
• shared_ptr/weak_ptr 的“计数”在主流平台上是原子操作,没有用锁,性能不俗。
• shared_ptr/weak_ptr 的线程安全级别与std::string 和STL 容器一样,

 4、muduo

muduo 的头文件明确分为客户可见和客户不可见两类。。对于使用muduo 库而言,只需要掌握5 个关键类:Buffer、EventLoop、TcpConnection、TcpClient、TcpServer

公开接口
• Buffer 仿Netty ChannelBuffer 的buffer class,数据的读写通过buffer 进行。用户代码不需要调用read(2)/write(2),只需要处理收到的数据和准备好要发送的数据(§7.4)。
• InetAddress 封装IPv4 地址(end point),注意,它不能解析域名,只认IP 地址。因为直接gethostbyname(3) 解析域名会阻塞IO 线程。
EventLoop 事件循环(反应器Reactor),每个线程只能有一个EventLoop 实体,它负责IO 和定时器事件的分派。它用eventfd(2) 来异步唤醒,这有别于传统的用一对pipe(2) 的办法。它用TimerQueue 作为计时器管理,用Poller 作为IO multiplexing。
• EventLoopThread 启动一个线程,在其中运行EventLoop::loop()。
TcpConnection 整个网络库的核心封装一次TCP 连接,注意它不能发起连接。
• TcpClient 用于编写网络客户端,能发起连接,并且有重试功能。
• TcpServer 用于编写网络服务器,接受客户的连接。

未完待续.......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值