Gecko 執行緒分析二

2021-08-28 08:03:45 字數 3589 閱讀 4463

gecko 執行緒分析二

執行緒分析二 之 nsithread nsthread

gecko是如何使用thread的。這些天一直覺得gecko中是使用自己的執行緒機制來完成事件的呼叫的。否則很難真正搞懂gecko中內部的工作流程。(可是老闆就是不重視,自己想來想去的,按他自己的想法指揮。)沒辦法,只能自己來看gecko執行緒機制是怎麼回事兒了。

通過從網上查詢資料和自己對**的查詢了解,現在對gecko的執行緒情況總結整理如下。

首先,gecko內部的thread基本是使用nsithread這個inte***ce,通過ns_newthread來產生。

thread 會有乙個job queue,thread會一直執行queue裡面的job,如果沒有job時,則是停留在queue內部,此時不會消耗額外的cpu;而由ns_newthread所產生的thread會由另外乙個class,nsthreadmanager來管理,當系統要停止時,nsthreadmanager會把它所管理的所有的thread分別呼叫nsithread::shutdown,來將其下的thread停止。

下面是nsithread的主要函式:

class ns_no_vtable nsithread : publicnsieventtarget {

public:

ns_declare_static_iid_accessor(ns_ithread_iid)

/* [noscript] readonly attributeprthread prthread; */

ns_imethod getprthread(prthread**aprthread) = 0;

/* void shutdown (); */

ns_imethod shutdown(void) = 0;

/* boolean haspendingevents (); */

ns_imethod haspendingevents(bool*_retval) = 0;

/* boolean processnextevent (inboolean maywait); */

ns_imethod processnextevent(boolmaywait, bool *_retval) = 0;

ns_define_static_iid_accessor(nsithread, ns_ithread_iid)

對於以上函式的介紹在gecko的idl宣告的注釋中有很好的解釋:

下面是nsithread的繼承圖和工作的協作圖:

下面我們來看一段簡單的例子:

nscomptr sthread;

class hellothread : public refcounted {

public:

void helloworld() {

printf(「here is hellothread」);

void inititalizethread() {

ns_newthread(getter_addrefs(sthread));

void releasethread() {

sthread->shutdown();

void addjob() {

nscomptr event =ns_newrunnablemethod(new hellothread(), &hellothread::helloworld);

sthread->dispatch(event,ns_dispatch_normal);

上面是乙個簡單的hellothread,當使用者呼叫addjob時,便會新增乙個job到nsthread的queue裡面,然後sthread便會去執行helloworld()這個function,列印出」here is hellothread」.

下面是幾個注意點:

1、hellothread不一定要繼承refcounted,只要有addref和release即可。

2、只要呼叫ns_dispatchtomainthread便會將job指定給mainthread。

3、shutdown是乙個blockingfunction,當執行sthread->shutdown時,會等待將thread內部所有的job都執行完才會離開。

4、不要sthread本身呼叫自己shutdown,這樣會造成死鎖。

nsthread 成員函式:

addref()

nsisupports

adjustpriority(inlong delta)

nsisupportspriority

dispatch(innsirunnable event, in unsigned long flags)

nsieventtarget

dispatch_normal

nsieventtarget

dispatch_sync

nsieventtarget

getprthread()

nsthread

[inline]

haspendingevents()

nsithread

init()

nsthread

initcurrentthread()

nsthread

isoncurrentthread()

nsieventtarget

nsthread()

nsthread

nsthreadshutdownevent class

nsthread

[friend]

observer

nsithreadinternal

popeventqueue()

nsithreadinternal

priority

nsisupportspriority

priority_high

nsisupportspriority

priority_highest

nsisupportspriority

priority_low

nsisupportspriority

priority_lowest

nsisupportspriority

priority_normal

nsisupportspriority

processnextevent(inboolean maywait)

nsithread

prthread

nsithread

pusheventqueue(innsithreadeventfilter filter)

nsithreadinternal

queryinte***ce(innsiidref uuid,[iid_is(uuid), retval] out nsqiresult result)

nsisupports

release()

nsisupports

sglobalobserver

nsthread

[static]

shutdown()

nsithread

shutdownrequired()

nsthread

[inline]

zebra quagga執行緒分析

執行緒按照不同的功能進行分類。有6條雙鏈,分別表示不同型別的執行緒。將要執行的時候,就從不同的鍊錶中取出,新增到ready鍊錶中,執行完成之後,將執行緒結構體清空放到 unuse鍊錶中。一般利用現有unuse鍊錶的資源,根據功能新增在不同的鍊錶中。只有當執行緒結構體都使用了,即ununse鍊錶空的時...

Tomcat執行緒分析

用一般配置下tomcat 9執行緒情況進行分析 main thread 一般是唯一非daemon執行緒,await containerbackgroundprocessor 一般只有engine有此執行緒 connector一般將協議相關功能委託給自己的protocolhandler,protoco...

執行緒狀態分析

看了很多資料,有一些資料顯示執行緒的狀態是5種,還有的說是7種,我覺得還是根據原始碼分析才比較官方,準確,如下 我是基於jdk1.8的 public enum state 我們發現這是乙個列舉型別,狀態顯示是六種,分別是 新建 new 使用 new 關鍵字和 thread 類或其子類建立乙個執行緒物...