Chromium原码浅析 --- Chromium多线程的实现

上文对Chromium中多线程机制做了简要说明,下面从代码上加以分析。

Chromium多线程机制的实现可以说堪称经典,可以为我们好好学习和模仿。

每一个线程中包含有一个MessageLoop,MessageLoop实际上可以看作是任务的队列,线程就是不停的从MessageLoop中选择任务投入运行。一个任务运行完毕后,再从队列上选择下一个任务投入运行,直到队列上没有任务为止,然后线程处于休眠状态,等待新的任务加入。

这里所说的新的任务可以是在本线程中添加的,当然也可以是其他线程推送过来的。在线程之间相互添加任务时,Chromium的代码里是通过BrowserThread类的静态函数PostTask或PostDelayedTask完成的。这样可以实时获取每个线程的MessageLoop,每个线程都不会保存其他线程的MessageLoop指针,因为那样做会带来潜在的Bug,例如保存的MessageLoop指针可能由于线程的终止而被销毁了。

例如:BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind(&WriteToFile, "foo.txt", "helloworld!"));

就是把任务WriteToFile发送到File线程中去执行,本线程可以是File线程,亦可以是UI或其他线程。多线程编程最复杂的部分应该是多个线程之间数据的同步,而在Chromium的多线程设计中只需要在添加或提取任务时对MessageLoop队列数据同步,对MessageLoop操作加锁即可,这大大简化了多线程间任务的同步,减少了任务运行期间不必要的等待。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值