一、背景介绍
最近对ET的深度学习,记录学习过程遇到一些比较啃的硬骨头,也为后面回顾记录一些笔记。协程锁是一种与传统锁不一样的实现,功能一样都是防止某段代码并发执行。ET的协程锁是一种更轻量级的自我实现lock机制,深度学习CoroutineLockComponent能够更好理解lock技术和理解并发原理。
二、CoroutineLockComponent的数据结构
- 从CoroutineLockComponent Instance可以看出该类是一个单例,为整个框架服务。
- list是不同的类型的协程锁列表,项目都有很多控制并发的代码块,为每个块定义不同的类型,从而有很多的协程锁。
- CoroutineLockQueueType类中存了一个字典数据 Dictionary<long, CoroutineLockQueue> dictionary,key为long类型的协程锁type,CoroutineLockQueue为了具体某个类型的锁当前并发执行的个数列表。
- nextFrameRun表示下帧需要执行的锁数据,后面重点介绍。
- timers表示加入到锁管理器的所有的协程锁数据,key是时间即超时时间,value(CoroutineLockTimer)即实际的锁数据。该字典是一个排序好的SortedDictionary,提高timers的遍历访问效率。
- timeOutIds所有超时应该触发的协程锁。
- idGenerator内部管理的数据ID。
- minTime当前协程锁数据timers中超时时间最短那个。也就是说timers最先执行的时间,如果当前时间比minTime这个时间小说明当前的超时队列不会有任何锁超时被执行。
- timeNow当前时间。
二、CoroutineLockQueueType的数据结构
1、CoroutineLockQueueType基本数据
- 从上面的数据结构定义可以看出CoroutineLockQueueType是一个字典类型,key是一个long类型数据即所有的锁数据类型
自定义其他的锁类型可以在该类里面添加,在CoroutineLockComponentAwakeSystem初始化的时候会创建 List list数据,并且创建各个协程类型管理对象。 - CoroutineLockQueue是一个队列,里面存了CoroutineLockInfo,表示具体某个协程类型的实际锁数量,即当前代码块并发执行的个数。
- CoroutineLockInfo里面存了一个时间Time,以及ETTask Tcs,当前一个协程锁执行完成设置下一个Tcs的完成标签即激活下一个协程锁执行。
三、CoroutineLockComponent的执行流程
1. 添加协程锁
2. 协程锁超时逻辑判断
2. 激活下一个协程锁
- coroutineLockQueueType.Remove(key)把对应协程锁类型从dictionary里面移除并且情况CoroutineLockQueue队列。
- 在CoroutineLockDestroySystem中如果是当前协程锁自然正常执行则也会 把自己添加到RunNextCoroutine中即:
CoroutineLockComponent.Instance.RunNextCoroutine(self.coroutineLockType, self.key, self.level + 1);
在Update中会正常释放