线程模型一
组成:
-
任务队列, 队列中的每一项是包含了run方法的任务对象
-
线程控制器: 用于控制线程的使用
-
线程池: 用于线程的分配
好处:
-
可以控制线程的数量, 线程太多会影响效率, 每次切换效率都会进行内核态和用户态的切换 以及压栈出栈, 现代语言为了解决这个问题使用了协成,只在用户态下压栈出栈,而不在内核态进行压栈出栈,这样可以提高执行效率.
-
由于使用的任务队列, 不会出现任务丢失的情况.
-
频繁的创建和销毁线程会降低执行效率, 线程池的存在,减少了线程的频繁创建和销毁, 因为线程池的初始化时就在内部创建了一些线程, 需要的时候直接从线程池了获取即可.
-
减少了锁的使用
线程之间协作逻辑的实现:
一个线程执行完之后 生成一个新的任务加入到任务队列, 通过线程控制模块分配一个新的线程执行后面的操作, 已实现线程之间有序的协作关系.
线程模型二
类似于多进程, 当程序运行的时候 就将全部的线程都启动起来, 为每个线程分配一个线程队列, 这样每个线程就不停的从队列中取出消息进行处理, 直到队列为空进入睡眠状态, 为了唤醒线程, 添加一个唤醒事件, 每次有任务添加进来就触发唤醒事件.
线程的协作: 一个线程生成一个任务插入到另一个线程的任务队列中, 收到任务的线程则在内部进行任务处理, 以这样的方式实现线程直接的协作.
此模型也减少了锁的使用.
webrtc使用的是第二种线程模型, 但webrtc中线程存在父子关系,所以真实的模型会比这里复杂一些.
例如:组包线程从RTP队列中接收任务, 任务队列中存放的RTP包, 线程会把RTP头去掉拿出里面的payload,把几个RTP包组成一帧, 然后把帧交给解码线程的任务队列进行解码, 解码线程从任务队列中拿出压缩的视频帧 解码成YUV数据, 然后将YUV数据放入渲染线程的任务队列,渲染线程将YUV数据处理后渲染到显示器上.