Chrome原始碼分析之執行緒模式(十一)

來源:互聯網
上載者:User

Chrome的主進程和Renderer進程都建立了多個線程為自己服務。前面已經提到過,主進程主要包括下面幾個線程:

ui線程,也就是主線程,主要用於響應系統訊息和介面上來自使用者的各種輸入訊息。

I/O線程,看名字就知道,主要處理網路通訊的線程,處理序間通訊因為採用的是具名管道,也算在I/O裡面,統一由該線程負責。

file線程,負責關於檔案系統的各種操作的線程。

db線程,處理資料庫方面的事務。

另外還有幾個組件有自己的線程,比如記錄,代理,自動化代理程式等。

Google重點提到,為了提高使用者體驗,需要經可能的保持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。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.