CEF线程模型与初始化过程详解

发布时间:2023年12月28日


上一篇说了CEF框架的消息传递,实际上这个消息传递指的是进程之间的消息传递,也就是IPC的方式在Browser,Render进程之间传递消息。

这一篇就接上篇,说说CEF的线程模型,因为在CEF框架的main entry中,主要的三个函数CefInitialize、CefRunMessageLoop和CefShutdown都和这个模型有关。

官方文档主要参考两篇:

CEF General Usage

Threading and Tasks in Chrome

Chromium Sequence

CEF进程 & 线程模型

CEF框架是基于Chromium的代码框架来实现的,所以CEF的进程与线程模型就都使用的是Chromuim的模型框架。所以,除了CEF项目的代码,还需要参考CEF LIB和chromium的代码:

CEF LIB

chromium

网上有一些使用翻译软件直接翻译的文章,不太建议看,实在是太难理解,不如直接看google的英文资料+代码,理解起来比较快。

我针对资料和代码的理解,画了一张大致的图:

几个大的框就是CEF框架拥有的几个子进程:

  • Browser进程,一般来说就是主进程。
  • Render进程,用于渲染界面
  • GPU加速进程
  • 其他进程等
  • 进程之间使用IPC通讯,就是上一篇提到的内容。

每个进程中包含的内容基本上是一样的,我图中就是以Browser进程为例。

Chromium中的线程概念

在Chromium中,有一个重要的概念:Sequence,官方也给出了一个非常好的说明文档:[Chromium Sequence]

多线程中的数据竞争,也就是线程安全问题

一个进程中的多个线程,一般来说都是共享同样的内存空间,所以需要解决线程并行执行期间,数据的准确性问题:
一般的解决办法有两类:

  • 共享内存,关键数据加锁: mutex。Must use mutexes, condvars, etc. to ensure safety
  • 线程之间通过信号量等方式通讯,相当于是线程间通讯。Must use message-passing between threads
  • chromium采用的是综合方式,但是主要还是线程间的通讯方式。Send data and tasks between threads, instead of using locks to synchronize;Locks/condition variables exist, but are rarely needed.

chromium对这个通讯方式给出了更具体的实现方式:Sequence。


简单的说,就是多个任务的一个有序集合,这个有序集合在一个虚拟的线程上运行,这个虚拟的线程可以在实际运行过程中,由不同的实际线程(Physical thread)来承载。

至于这个承载方式,chromium也给出了选择方式:


也就是一个对多对的关系,类似线程池,在chromium框架中有一个SequenceManager类,就是用来做这个东西的调度用的。

调度过程大致如下:

其他线程概念

Google的官方文档都已经一一列举出来了:

  • Task: A unit of work to be processed. Effectively a function pointer with optionally associated state. In Chrome this is base::OnceCallback and base::RepeatingCallback created via base::BindOnce and base::BindRepeating, respectively. (documentation).
    简单的说,一个task就可以对应一个任务,或者换到代码里的概念就是一个函数,这个任务或者函数需要被执行。

      void TaskA() {}
      void TaskB(int v) {}
    
      auto task_a = base::BindOnce(&TaskA);
      auto task_b = base::BindOnce(&TaskB, 42);
    
    • 从上面的代码可以看出,task就是由一个函数指针得到的。再由BindOnce或者BindRepeating来封装一次,告诉chromium,这个任务是需要被执行一次,或者是被重复执行的(
文章来源:https://blog.csdn.net/pcgamer/article/details/135261664
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。