一、 初始化流程

每一个RenderProcessHostImpl(RenderProcessImpl)都会ChannelProxy(SyncChannel)—>ChannelProxy::Context—>Channel—>ChannelImpl—>ChannelReader依次初始化下去。并且将this指针传递给下一个类,这样发送消息时层层向下传递。接收消息时则逆向传递。

网络连接建立过程:


主要对象初始化流程:


过滤器初始化流程:


二、 通信机制

1. 异步消息通信机制

异步消息机制相对来说比较简单,实际产生消息的线程将消息抛给IO线程任务队列后立即返回。IO线程发送消息。对端IO线程接收消息后放入本线程任务队列。最终在本线程执行,或者抛入其他线程的任务队列。

2. 同步消息通信机制

同步消息机制比较复杂,产生消息的线程A将消息抛给IO线程的任务队列后,会阻塞在一个条件变量上,等待IO线程返回同步消息应答将其唤醒。

SyncContext维护了一个线程安全的队列,用于监听来自I/O线程的同步消息应答。当应答来到,并且匹配到某一消息ID,其就会唤醒阻塞的原线程。

在原线程阻塞期间,同样有可能有消息到来,异步消息被放入任务队列并等待解除阻塞之后进行处理。而同步消息必须以可重入的方式进行处理,以避免死锁。

ReceivedSyncMsgQueue类专门用来处理此时收到的同步消息。此类是处理同步消息的关键。当阻塞在Send()时,我们必须立即处理同步消息,以防止其阻塞应答。。。。。。好复杂。。。。晕了。。。。

总的来说,同步消息会使线程阻塞等待应答。此时若收到应答则解除阻塞,若收到异步消息则放入任务队列,收到同步消息则进行某种处理。。。。。。此时为了避免使用复杂的互斥锁和条件变量,就有一个WaitableEvent类作为线程同步工具,来等待处理某事件。。。。

更多相关文章

  1. Android(安卓)BroadcastReceiver 学习笔记
  2. Android实现倒计时跳转Activity
  3. android手机游戏之绘图
  4. Android开发_多线程详解(九)
  5. android中的常见类(2)
  6. android 实例和分析
  7. 字节跳动面试官:Android源码的Binder权限是如何控制?
  8. android Support Annotations(注解支持)
  9. Android(安卓)消息推送通知指南

随机推荐

  1. PHP和MySQL ACID程序设计
  2. 如何从表中获取每个id的最新状态?
  3. 获取具有行sql中的最大值的列名
  4. MySQL数据库 prompt参数详解
  5. MySql与SqlServer的一些常用用法的差别
  6. MySQL数据库之part1
  7. 转载:Centos7 从零编译Nginx+PHP+MySql 序
  8. 如何将休眠时间戳映射到MySQL BIGINT?
  9. 存储过程,参数数量不正确bug?
  10. centos7 Mycat/MySQL/MariaDB安装部署