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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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(線程)》

轉載自:http://blog.csdn.net/night_cat/article/details/3496797

Threads(線程)

 

libjingle 考慮到使用到此庫的應用程序的性能,libjingle內部支持多線程。其內組件使用12個全局線程:

 signaling thread  被用作創建底層(基礎)組件,

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

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

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

 

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

 

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

// 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管理,當被請求時,ThreadManager會返回這些Thread對象。SessionManager被創建時通過調用ThreadManager::CurrentThread得到一個signal thread(當無worker thread 傳遞給SessionManager構造函數時,同時得到一個work thread)XmppPump類把當前線程當作它的signal thread來用(XmppPump uses the current thread for its signaling thread)。所以,應用程序必須為signal thread創建一個Thread對象(或其子類對象),并在SessionManager對象創建之前或在XmppPump工作之前,把此對象放進ThreadManager的線程池里。(Signing In to a Server(登錄服務器) 有示例)有兩種方法創建一個Thread對象:

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

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

 

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

 

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

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

 

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

       對象要求一個線程指針作輸入參數,并儲存這個指針。

       對象在創建時取得當前線程(構造函數中調用ThreadManager::CurrentThread()取得),把取得的線程存進對象內部成員變量引用它,一般應用于獲取特定的線程。(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

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

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

 

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

這是一個對象通過其它線程調用自身函數時而廣范使用的范例:

// 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)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            久久综合中文字幕| 久久久综合精品| 久久中文精品| 久久精品视频在线播放| 日韩亚洲欧美在线观看| 亚洲精品护士| 一区二区三区 在线观看视| 一区二区黄色| 性做久久久久久免费观看欧美 | 国内精品99| 国产精品亚发布| 国产情人节一区| 亚洲福利视频免费观看| 日韩亚洲国产精品| 午夜精品视频在线观看一区二区| 欧美伊人影院| 欧美电影在线免费观看网站| 亚洲国产小视频在线观看| 久久久另类综合| 亚洲国产日韩精品| 亚洲一区二区三区久久| 久久久www成人免费无遮挡大片 | 亚洲综合社区| 久久综合网色—综合色88| 欧美精品成人| 国产日韩欧美黄色| 99国产精品久久久久久久久久| 亚洲欧美日韩在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲精品女av网站| 亚洲伊人观看| 欧美大秀在线观看| 国产在线欧美| 亚洲欧美日韩精品久久奇米色影视| 久久一二三国产| 亚洲一区二区三区免费视频 | 欧美日韩国产综合在线| 久久综合九色综合欧美狠狠| 欧美日韩亚洲一区三区| 一区精品久久| 亚洲乱码国产乱码精品精天堂| 亚洲欧美自拍偷拍| 亚洲欧洲综合| 欧美伊人精品成人久久综合97| 欧美激情视频网站| 国产一区二区日韩精品| 中日韩视频在线观看| 久久精品视频播放| 亚洲精品免费一区二区三区| 久久久精品一区| 国产精品亚洲综合天堂夜夜 | 国产偷久久久精品专区| 亚洲视频第一页| 亚洲精品国产无天堂网2021| 久久精品伊人| 黄色精品网站| 久久久青草婷婷精品综合日韩 | 亚洲小视频在线观看| 亚洲国产天堂久久综合网| 免费在线欧美黄色| 在线看片第一页欧美| 久久综合一区二区| 欧美在线日韩精品| 国模大胆一区二区三区| 久久久精品久久久久| 欧美在线中文字幕| 伊人成年综合电影网| 美女国内精品自产拍在线播放| 亚欧成人在线| 狠狠做深爱婷婷久久综合一区| 久久成人精品无人区| 欧美在线一二三区| 在线精品观看| 亚洲精品社区| 国产精品蜜臀在线观看| 欧美在线3区| 久久国产精品高清| 在线看欧美日韩| 亚洲日本在线视频观看| 欧美视频中文字幕在线| 欧美综合国产精品久久丁香| 久久久国产亚洲精品| 亚洲国产一区二区a毛片| 亚洲精品乱码久久久久久按摩观| 国产精品久久久久久久久久久久久久 | 久久久激情视频| 激情久久久久久| 亚洲一区免费看| 亚洲特色特黄| 国产亚洲欧美另类中文| 免费中文字幕日韩欧美| 欧美久久久久久| 久久久99精品免费观看不卡| 美女视频网站黄色亚洲| 亚洲天堂av电影| 欧美在线免费| 亚洲一区二区三区中文字幕| 欧美一区=区| 99国产精品国产精品毛片| 久久av老司机精品网站导航| 在线一区二区三区四区五区| 欧美在线一级va免费观看| 中文久久精品| 久久综合五月| 久久久久久尹人网香蕉| 国产精品v片在线观看不卡| 欧美sm重口味系列视频在线观看| 欧美视频二区| 亚洲黑丝在线| 一区二区在线观看av| 一本色道久久综合狠狠躁篇怎么玩| 国产视频久久久久久久| 亚洲精品少妇网址| 亚洲高清久久久| 亚洲一区二区黄色| 99亚洲伊人久久精品影院红桃| 欧美在线资源| 欧美一区日本一区韩国一区| 欧美日韩在线一二三| 亚洲第一页在线| 黄色另类av| 久久久久久9| 久久久久9999亚洲精品| 国产精品久久久久久久久借妻| 99国产精品久久久久老师| 亚洲国产精品久久久久| 久久精品一区蜜桃臀影院| 欧美在线免费播放| 国产精品视频午夜| 中国亚洲黄色| 亚洲综合视频1区| 欧美日韩精品在线视频| 亚洲国产精品尤物yw在线观看| 亚洲国产高清自拍| 免费一级欧美片在线观看| 免费在线欧美视频| 在线看欧美视频| 欧美成人高清视频| 亚洲欧洲精品一区二区| 日韩天天综合| 欧美日韩亚洲一区二区三区四区| 亚洲精品美女在线| 亚洲性夜色噜噜噜7777| 欧美午夜欧美| 午夜精品国产更新| 久久九九免费视频| 国产综合色一区二区三区| 欧美一区二区免费视频| 欧美中文字幕在线| 国内精品久久久久影院薰衣草| 香蕉久久国产| 免费日韩成人| 99综合电影在线视频| 欧美视频久久| 久久免费视频网| 欧美成在线视频| 亚洲日韩中文字幕在线播放| 亚洲精品少妇网址| 欧美午夜精品一区| 欧美一区综合| 亚洲精品久久久蜜桃| 亚洲一区二区三区在线| 国产嫩草一区二区三区在线观看| 欧美一级理论片| 亚洲高清视频在线观看| 在线亚洲国产精品网站| 国产精品视频xxx| 久久久亚洲精品一区二区三区| 欧美大胆人体视频| 亚洲综合精品一区二区| 一区视频在线播放| 欧美日韩国产色综合一二三四| 亚洲一区国产| 亚洲第一福利视频| 欧美一区二区三区男人的天堂| 亚洲成人在线观看视频| 国产精品久久91| 免费欧美网站| 亚洲欧美日韩网| 亚洲日本免费电影| 欧美不卡高清| 久久精品三级| 亚洲欧美日韩一区二区| 亚洲国产另类久久精品| 国产精品男gay被猛男狂揉视频| 久久天堂av综合合色| 亚洲一区二区三区欧美 | 在线视频一区观看| 影视先锋久久| 国产欧美丝祙| 欧美日韩喷水| 欧美成ee人免费视频| 欧美一区高清| 亚洲一区二区三区精品在线| 91久久国产综合久久| 欧美在线国产| 亚洲一区二区在线看| 亚洲精品国产精品国产自| 国产在线播精品第三| 国产精品美女久久|