03_muduo_base3

5.6 互斥锁和条件变量的封装

类图

该类是封装了互斥锁的一些基本操作,包括互斥锁的初始化、销毁、上锁、解锁等功能。但是实际上使用RAII技术又封装了一个类,那就是MutexLockGuard。这主要也是采取了类似智能指针的封装思路,让互斥锁的生命周期交给操作系统去管理,释放的时机由操作系统管理,防止程序员忘记释放导致内存泄漏。

条件变量

条件变量是必须和互斥锁配合使用。waitForSeconds(int)这里主要是用来判断是否超时。

//伪代码
mutex上锁
 while(条件){
 	  wait//上锁->等待条件变量->加锁。这里的上锁和解锁是为了保证条件变量的操作是线程安全的
 }
mutex解锁

CountDownLatch,这是对条件变量的封装。既可以用于所有子线程等待主线程发起执行命令(notifyAll),也可以用于主线程等待子线程初始化完毕才开始执行。

API分析:

/*
countDown()计数器减为0时,唤醒所有阻塞在条件变量的线程
getCount():获取当前计数器
*/

5.7 缓冲区的封装。

主要分为了无界缓冲区(BlockingQueue)和有界缓冲区(BoundedBlockingQueen)。本质上是一个生产者-消费者问题中充当仓库的一个角色。

API接口:

/*
put:生产者将产品放到队列,注意需要上锁,队列长度无限
take:消费者消费产品,需要互斥锁
*/

API接口:

/*
和无界的区别在于需要判断队列是否满了。并且队列是采用了环形缓冲区(类似循环队列)的方式。头部用来读取/消费,尾部用来写/生产
*/

5.8 ThreadPool

本质上是一个生产者-消费者问题。

类图:

API接口:

/*
run() : 往线程池中添加任务。
runInThread():执行任务
take():获取任务
*/

5.9 线程安全Singleton

类图:

/*
ponce:保证只能被执行一次
value:一个模板T指针
instance():返回一个单例指针
构造函数和析构函数都是私有的
inti()和destory()都是私有的,内部创建和内部销毁。
*/
posted @ 2024-11-10 13:23  炫炫子  阅读(4)  评论(0编辑  收藏  举报