青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

libjingle翻譯之《Important Concepts(重要概念)之Threads(線程)》

轉(zhuǎn)載自:http://blog.csdn.net/night_cat/article/details/3496797

Threads(線程)

 

libjingle 考慮到使用到此庫的應(yīng)用程序的性能,libjingle內(nèi)部支持多線程。其內(nèi)組件使用12個全局線程:

 signaling thread  被用作創(chuàng)建底層(基礎(chǔ))組件,

    例如:Session Management,Control,XMPP Messaging組件。

 worker thread  ( 有時稱作channel thread)用來集中處理p2p組件中的對象提交過來的大量資源,例如:數(shù)據(jù)流。之所以這樣用另外的線程單獨處理,是為了避免數(shù)據(jù)流阻塞或被XMPP/用戶界面組件阻塞。使用 worker thread的類包括ChannelManage,SocketMonitor,P2PTransportChannel 和 屬于Port類的對象。

若起用worker thread,使之工作,在應(yīng)用中必須創(chuàng)建一個Thread類對象,并把此對象當(dāng)作SessionManager的構(gòu)造函數(shù)的參數(shù)。(如果SessionManager類對象在創(chuàng)建時,沒有傳遞給它Thread對象,則SessionManager類將在內(nèi)部創(chuàng)建一個線程,當(dāng)作worker thread)CallClient::InitPhone示范了如何為底層組件(low-level components)創(chuàng)建一個worker thread方法。

 

另外、libjingle提供了一個基類SignalThread。擴(kuò)展此類可以讓一個擴(kuò)展類對象存在于它自身代表的線程,此擴(kuò)展類對象可以被實例化,啟動,單獨離開,結(jié)束時自釋放。更多信息請查看signalthread.h/cc

 

注意:盡管libjingle支持多線程,但是只有幾個函數(shù)通過呼叫方線程的驗證來支持線程安全,并且極少函數(shù)做了線程鎖定。下面的片斷示范了在函數(shù)中如何安全地呼叫線程(或線程安全地被呼叫):

// Check that being called from the channel (e.g., worker) thread.

ASSERT(talk_base::Thread::Current() == channel_thread_);

channel_thread_->Clear(this);

 

libjingle中用到的所有線程,signaling threadworker thread,其它的一些線程,都是talk_base::Thread的對象(或子類的對象)。所有的Thread對象都被ThreadManager管理,當(dāng)被請求時,ThreadManager會返回這些Thread對象。SessionManager被創(chuàng)建時通過調(diào)用ThreadManager::CurrentThread得到一個signal thread(當(dāng)無worker thread 傳遞給SessionManager構(gòu)造函數(shù)時,同時得到一個work thread)XmppPump類把當(dāng)前線程當(dāng)作它的signal thread來用(XmppPump uses the current thread for its signaling thread)。所以,應(yīng)用程序必須為signal thread創(chuàng)建一個Thread對象(或其子類對象),并在SessionManager對象創(chuàng)建之前或在XmppPump工作之前,把此對象放進(jìn)ThreadManager的線程池里。(Signing In to a Server(登錄服務(wù)器) 有示例)有兩種方法創(chuàng)建一個Thread對象:

AutoThread    這種方式就是libjingleThread對象包裝一個操作系統(tǒng)中的線程,并把它當(dāng)作ThreadManager線程池里的當(dāng)前線程(當(dāng)然,Thread::CurrentThread()被調(diào)用時,此線程會被提取出來)。

Thread   這種方式將創(chuàng)建一個新線程并用Thread類包裝,比較典型就是的創(chuàng)建worker thread。使此線程發(fā)生作用,應(yīng)用程序必須新創(chuàng)建一個Thread對象,調(diào)用ThreadManager::Add()ThreadManager::SetCurrent()把它丟進(jìn)線程池里,并且調(diào)用Run()使之在阻塞狀態(tài)下運行或調(diào)用Start()使之處于監(jiān)聽狀態(tài)。

 

線程為對象間或?qū)ο髢?nèi)部的消息溝通提供了“管道”()。例如:SocketManager可以通過其它線程向自己發(fā)送銷毀一個套接字的消息,或當(dāng)鏈接候選被產(chǎn)生時向SessionManager發(fā)送消息。Thread繼承自MessageQueue,所以Thread的對象具有了SendPost,和一些同步或異步發(fā)送消息的函數(shù)。如果要使一個對象能夠接收到MessageQueue送出的消息,那么此對象必須繼承和實現(xiàn)MessageHandlerMessageHandler定義了一個OnMessage函數(shù),此函數(shù)在MessageQueue送出消息時被調(diào)用,用來接收MessageQueue送出的消息。

 

你可以通過任何線程向繼承自talk_base::MessageHandler的任何對象發(fā)送消息。盡管能夠做到,如果你發(fā)出的消息是為了集中處理大量的數(shù)據(jù),應(yīng)用程序應(yīng)該通過worker thread。調(diào)用SessionManager::worker_thread()可以得到worker thread的句柄。

調(diào)用Session::Manager::signaling_thread()可以得到 signaling thrread的句柄。

 

對象使用一個指定的線程有如下幾種方式:

       對象要求一個線程指針作輸入?yún)?shù),并儲存這個指針。

       對象在創(chuàng)建時取得當(dāng)前線程(構(gòu)造函數(shù)中調(diào)用ThreadManager::CurrentThread()取得),把取得的線程存進(jìn)對象內(nèi)部成員變量引用它,一般應(yīng)用于獲取特定的線程。(it can assume that the current thread when it is created (accessed byThreadManager::CurrentThread in its constructor) is a particular thread and cache a member pointer to it

       對象調(diào)用SessionManger::signal_thread()  SessionManager::worker_thread()獲取線程。

       以上三種方法,libjingle均有用到。

 

因為一個對象可以被任意線程使用,對象可能需要驗證當(dāng)前調(diào)用是來自哪個線程的方法。應(yīng)用可以調(diào)用Thread::Current()得到當(dāng)前線程的句柄,然后與對象內(nèi)部保存線程的數(shù)據(jù)成員進(jìn)行比較,此數(shù)據(jù)成員的值可以是從SessionManager中暴露在外面的線程,或是對象在創(chuàng)建時通過構(gòu)造函數(shù)傳進(jìn)去的初始化值。

這是一個對象通過其它線程調(diào)用自身函數(shù)時而廣范使用的范例:

// Note that worker_thread_ is not initialized until someone 
// calls PseudoTcpChannel::Connect
// Also note that this method *is* thread-safe. 
bool PseudoTcpChannel::Connect(const std::string& channel_name) {
  ASSERT(signal_thread_->IsCurrent());
  CritScope lock(&cs_);
    if (channel_)
      return false;
    ASSERT(session_ != NULL);
    worker_thread_ = session_->session_manager()->worker_thread();
...
}
 
void PseudoTcpChannel::SomeFunction(){
  ...
  // Post a message to yourself over the worker thread.
  worker_thread_->Post(this, MSG_PING); // <- Goes in here....
  ...
}
 
// Handle queued requests.
void PseudoTcpChannel::OnMessage(Message *pmsg) {
  if (pmsg->message_id == MSG_SORT)
    OnSort();
  else if (pmsg->message_id == MSG_PING) // -> And comes out here!
    // Check that we're in the worker thread before proceding.
    ASSERT(worker_thread_->IsCurrent());
    OnPing();
  else if (pmsg->message_id == MSG_ALLOCATE)
    OnAllocate();
  else
    assert(false);
}



posted on 2013-09-01 16:29 楊粼波 閱讀(499) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲黄色成人久久久| 亚洲一本大道在线| 欧美午夜电影在线观看| 久久疯狂做爰流白浆xx| 9色国产精品| 欧美成人综合网站| 久久精品国产欧美激情| 亚洲天堂av电影| 亚洲人成亚洲人成在线观看图片| 国产农村妇女毛片精品久久麻豆| 欧美日韩ab| 欧美韩日亚洲| 久热精品视频| 久久久精品国产免大香伊 | 国产精品女人久久久久久| 牛牛国产精品| 久久久九九九九| 午夜精品视频在线| 亚洲一区二区精品视频| 亚洲美女电影在线| 亚洲精品中文字幕在线| 91久久精品一区| 亚洲第一网站| 欧美国产精品一区| 男人的天堂亚洲| 蜜桃av一区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 久久狠狠久久综合桃花| 欧美一区二区福利在线| 亚洲欧美日韩精品综合在线观看 | 久久一综合视频| 久久久www成人免费无遮挡大片| 午夜激情亚洲| 欧美一级艳片视频免费观看| 亚洲欧美日韩国产一区二区| 亚洲中午字幕| 小辣椒精品导航| 午夜一区在线| 久久精品道一区二区三区| 欧美在线国产精品| 久久久九九九九| 美女999久久久精品视频| 免费高清在线一区| 欧美黑人一区二区三区| 亚洲国产精品www| 亚洲人成啪啪网站| 99ri日韩精品视频| 亚洲一级黄色av| 欧美一区1区三区3区公司| 欧美在线看片a免费观看| 久久精品亚洲一区| 久热精品在线视频| 欧美日韩第一区日日骚| 国产精品理论片在线观看| 国产欧美精品在线| 在线观看国产一区二区| 亚洲精品日韩精品| 一卡二卡3卡四卡高清精品视频| 亚洲午夜女主播在线直播| 欧美在线综合| 老司机久久99久久精品播放免费| 亚洲国产高清视频| 亚洲天堂激情| 久久精品视频va| 欧美另类69精品久久久久9999| 国产精品99免费看 | 91久久精品国产91久久| 亚洲天堂激情| 久久精品99国产精品| 欧美福利视频网站| 一区二区激情| 久久不射中文字幕| 欧美欧美在线| 国产亚洲精品久| 99热精品在线| 久久成人免费视频| 亚洲人成网站777色婷婷| 亚洲中字在线| 欧美成人精品h版在线观看| 国产精品久久久久久久久久尿| 韩国一区二区在线观看| 一区二区精品| 久久久噜噜噜久久| aa级大片欧美| 久久综合精品一区| 国产精品美女久久久久久免费| 在线看日韩欧美| 亚洲女女女同性video| 男女精品网站| 亚洲一区二区久久| 欧美精品乱人伦久久久久久 | 午夜在线播放视频欧美| 欧美大片一区二区| 国模私拍视频一区| 亚洲一区二区三区涩| 欧美jjzz| 亚洲一区国产视频| 欧美日韩国产在线一区| 亚洲福利小视频| 亚洲欧美日韩中文视频| 亚洲欧洲一区二区在线播放| 久久国产成人| 国产精品色网| 亚洲视频在线免费观看| 亚洲国产合集| 久久久久久久精| 国产欧美亚洲视频| 亚洲免费视频成人| 亚洲黄色一区| 免费日韩av片| 黄色在线成人| 久久久精品视频成人| 亚洲免费视频一区二区| 欧美日韩一二三区| 亚洲看片网站| 亚洲高清视频一区| 免费看成人av| 亚洲承认在线| 欧美成人中文字幕在线| 久久久精品tv| 激情视频一区二区| 久久这里只有| 久久精品在线播放| 黑人巨大精品欧美黑白配亚洲 | 欧美激情第一页xxx| 久久久久国产一区二区| 黄色影院成人| 久久一本综合频道| 久久精品国产一区二区三区 | 亚洲午夜女主播在线直播| 亚洲精品一区中文| 欧美日韩亚洲激情| 亚洲欧美日韩精品久久久久| 在线综合亚洲| 国产精品视频成人| 欧美一区二区三区免费视| 亚洲欧美国产精品桃花| 国产欧美一区二区精品忘忧草| 久久激情网站| 久久深夜福利免费观看| 亚洲国产成人久久综合| 亚洲第一区中文99精品| 欧美裸体一区二区三区| 亚洲伊人观看| 亚洲字幕一区二区| 狠狠色香婷婷久久亚洲精品| 蜜臀久久99精品久久久画质超高清| 久久免费视频网站| 91久久线看在观草草青青| 亚洲欧洲在线一区| 国产精品成人午夜| 久久成人18免费网站| 久久精品系列| 亚洲美女视频| 在线视频一区二区| 国内外成人免费激情在线视频网站 | 欧美性色aⅴ视频一区日韩精品| 午夜久久黄色| 欧美一区二区在线免费播放| 在线播放日韩专区| 亚洲三级电影全部在线观看高清| 国产精品大片wwwwww| 久久久久久网| 毛片一区二区| 亚洲欧美国产精品专区久久| 欧美综合国产精品久久丁香| 亚洲精品久久久久久久久久久久久| 亚洲精品国精品久久99热| 国产精品午夜国产小视频| 久久视频国产精品免费视频在线| 欧美成人亚洲| 欧美一区二区国产| 欧美成人精品1314www| 午夜精品一区二区三区在线视| 久久精品亚洲国产奇米99| 99精品国产在热久久| 翔田千里一区二区| 亚洲精品久久久久久久久久久久久| 亚洲香蕉成视频在线观看 | 午夜在线成人av| 久久在线免费| 性欧美8khd高清极品| 免费黄网站欧美| 亚洲欧美日韩综合aⅴ视频| 久久久久久有精品国产| 亚洲午夜久久久久久久久电影网| 久久国产婷婷国产香蕉| 亚洲一区二区三区四区视频| 久久久久国产精品厨房| 亚洲一区二区四区| 老司机午夜精品视频在线观看| 亚洲尤物视频网| 欧美成人四级电影| 久久天天躁狠狠躁夜夜爽蜜月| 欧美性猛交99久久久久99按摩 | 国内精品视频在线观看| 一本色道久久综合亚洲精品不卡| 亚洲国产cao| 久久激情中文| 欧美影院午夜播放|