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 類或其子類建立乙個執行緒物...