CAMX线程模块涉及的主要类: ThreadManager(管理者),JobRegistry(任务注册),ThreadCore(核心)。数据存储涉及的主要结构:JobList(任务链),JobQueue(优先级队列,本质是数组)
通过JobRegistry将camx中其他模块执行任务注册到ThreadManager,ThreadManager通过ThreadCore处理camx模块注册的任务。ThreadCore通过系统线程接口进行多线程的实现。
模块结构与组成
图1-1 ThreadManager的JobList
ThreadManager将使用应用模块的任务处理通过JobRegistry添加到JobList。
图1-2 JobCore优先级队列
JobCore作为线程管理模块的核心处理单元,通过JobQueue即优先级队列对任务进行处理。Job级别由JobPriority定义:Critical、High、Normal。高优先级的任务优先得到系统的处理。
模块实现逻辑
- 初始化
- 注册处理
- 提交任务
- 取消处理与注销
初始化
图2-1ThreadManager初始化
创建JobList和JobQueue,核心处理执行体并建立ThreadCore与成员关系。
JobList存储ThreadManager管理的Job。JobRegistry通过RegisteredSlot标记一个注册,如果Slot为true为注册;RegisteredJob登记注册的任务处理。RegisteredSlot和RegisteredJob通过index对应。ThreadCore通过调用系统接口创建多线程处理优先级队列中的Job。
ThreadManager初始化阶段主要是进行数据结构的构建。JobList用来记录应用模块提交的任务;JobRegistry对使用模块注册的任务处理进行管理,其成员RegisteredSlot为位图标记结构,用于注册标记;ThreadCore作为任务核心调用系统多线程接口完成任务的优先处理。
注册处理
图2-2 任务处理的注册
step1:取可用Slot
step2:RegisteredJob中注册单元完成注册信息的填充
step3:更新RegisteredJob中注册单元Flush状态
提交任务
图2-3 向ThreadManager提交任务
图示以向ThreadManager提交一个Critical类型Job为例。
取消处理与注销
注销前对已注册任务进行取消,即FlushJobFamily。Flush由Blocking和UnBlocking两种方式。
图2-4 取消任务时Flush处理
Flush由两种方式:Blocking和UnBlocking。Blocking方式时需要step3/4等待Flush的结束
任务处理
与提交Job向对应,构成生产者&消费者模型。
1.生产者消费者模型
2.状态机
三种状态:NoFlush, FlushRequested, Flushed
DoWork
未完待续
模块接口
这里的接口指供外部模块访问的接口
1.创建一个Thread对象
Create ThreadManager对象的创建
Destroy ThreadManager对象销毁
2.JobFamily任务组处理
RegisterJobFamily 注册一个Job处理函数
UnregisterJobFamily
FlushJobFamily
ResumeJobFamily
GetJobCount 获取提交的注册Family的未完成runtime job数
GetInFlightCount 获取当前正在执行的runtime job数
3.提交一个任务
PostJob 提交一个任务到对应的JobFamily
4.调试
DumpStateToFile dump job信息到文件
DumoStateToLog dump job信息到日志输出
模块使用
1.创建ThreadManager对象:ThreadManager::Create
2.注册Job处理 threadManager->RegisterJobFamily(JobFunc, JobFuncName, ..., JobHandle),JobFunc:处理函数指针;JobFuncName:JobFamily名称;JobHandle:Job句柄,用于提交Job
3.提交Job threadManager->PostJob(JobHandle, ..., isBlocking) JobHandle:为RegisterJobFamily返回的JobHandle;isBlocking:表示该Thread是不是blocking执行
4.注销Job threadManager->UnregisterJobFamily(JobFunc, JobFuncName, JobHandle)
5.销毁ThreadManager对象:threadManager->Destroy
Camx有实际的应用可以参考,例如:DRQ