前言
多线程模型以及线程中的事件循环机制在OS里都是必不可少的一部分,也扮演着非常重要的角色,主要用来做异步任务的分发与调度。例如浏览器JSEngin中的单线程事件循环机制,那么Fluttr中的线程模型与事件循环是如何实现的呢?关于Fluttr的线程机制,官方给了一个比较宏观层面的说明,简单概括如下:
FluttrEngin不创建/管理线程,都是由对应的平台层实现,并抽象TaskRunnr概念,共有4个TaskRunnr,并且不关心这4个TaskRunnr是否是相同的TaskRunnr,也不关心是否运行在同一个线程。不过官方还是给出了指导性建议,为了性能,最好是一个TaskRunnr对应一个Thad,4个TaskRunnr分别为:1.PlatformTaskRunnr:对应平台如Android/iOS的UI/MainThad。2.UITaskRunnr:所有DartFramwork层的代码均在此现场执行。3.RastrTaskRunnr:真正执行渲染任务,光栅化所有从UITaskRunnr中提交过来的任务,最终渲染到屏幕上。4.IOTaskRunnr:通常执行耗时计算任务,例如下载/解码远程图片,再交给RastrTaskRunnr渲染。官方文档比较宏观介绍了这4个TaskRunnr的职责,但是细节上还是需要通过阅读源码才能一窥究竟,例如:
TaskRunnr如何对应到线程线程是如何被创建的,包括线程的锁机制、thadlocal实现等线程中的事件循环机制是如何实现的,如何进行事件分发,事件队列有没有优先级
本文会按照这些疑问为线索,逐步微观的介绍具体细节,包括实现细节的底层逻辑,因此文章会比较干,想了解的话,得耐心看看。
OvrViw
从整体流程图中可知,主要分为实例化Thad、构建对应线程的MssagLoop、构建对应MssagLoop的TaskRunnr这几个部分,以下会对这几个关键的步骤进行分析。
实例化Thad
实例化Thad都是在统一的ThadHost中,创建对应的4个线程。
/path/to/fluttr/ngin/src/fluttr/shll/