您的位置:首页 > 编程语言

Chrome源代码分析之线程模型(十一)

2013-04-27 16:44 302 查看
Chrome的主进程和Renderer进程都创建了多个线程为自己服务。前面已经提到过,主进程主要包括下面几个线程:

ui线程,也就是主线程,主要用于响应系统消息和界面上来自用户的各种输入消息。

I/O线程,看名字就知道,主要处理网络通信的线程,进程间通信因为采用的是命名管道,也算在I/O里面,统一由该线程负责。

file线程,负责关于文件系统的各种操作的线程。

db线程,处理数据库方面的事务。

另外还有几个组件有自己的线程,比如历史记录,代理,自动化代理等。

谷歌重点提到,为了提高用户体验,需要经可能的保持UI线程的及时响应能力,这就要求不能有一些阻塞的I/O或者其他费时的操作造成UI线程的阻塞。因此Chromet通过消息的传递来实现进程间的通信,而不是通常的做法:给线程加锁。同时也不建议用加锁的方式来实现对象的线程安全,而是让对象运行在某一个线程上。另外,所有的跨线程请求使用回调函数接口,这也是通过消息传递来实现的。

Chrome所有线程使用的是同一个线程模型,因此所有线程类继承自同一个基类,定义在文件:

src\base\base\thread.h中。

每个线程都有自己的消息循环对象,用来处理传递给线程的消息。消息循环类定MessageLoop的定义在:

src\base\message_loop.cc。

不同的线程包含不同的消息循环,在message_loop.h文件中定于了3种消息循环:

enum Type {

TYPE_DEFAULT,

TYPE_UI,

TYPE_IO

};

不管什么消息循环,均定义在MessageLoop类里面,在初始化的时候通过构造函数的参数传递一个类型进去。在构造函数中,根据不同的类型,会创建一个继承自MessagePumpWin类的子类。分别是MessagePumpForUI,MessagePumpForIO,MessagePumpDefault。每个MessageLoop有一个scoped_refptr<base::MessagePump> pump_的成员,用来保存MessageLoop所对应的MessagePumpWin。不同的消息循环包含了不同的MessagePumpWin,这是区分不同消息循环的关键。

在看看Thread类,Thread类的作用是管理MessageLoop,首先确定属于自己的MessageLoop,但MessageLoop的初始化并不是由Thread来完成。在必要的时候启动这个MessageLoop,并在需要的时候关闭这个MessageLoop。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: