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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            久久综合久久综合九色| 久久国产欧美日韩精品| 日韩视频免费观看| 亚洲国产日韩一区二区| 欧美久久久久久蜜桃| 久久国产黑丝| 91久久精品日日躁夜夜躁欧美| 亚洲区免费影片| 欧美成人午夜影院| 宅男精品视频| 亚洲高清视频的网址| 亚洲精品国精品久久99热| 欧美精品一区二区蜜臀亚洲| 亚洲精品一区在线观看香蕉| 美女亚洲精品| 亚洲桃色在线一区| 午夜欧美大尺度福利影院在线看| 亚洲一区欧美激情| 亚洲一区在线播放| 亚洲一区二区三区视频播放| 免费看亚洲片| 久久精品国产2020观看福利| 黄色精品一区二区| 女女同性女同一区二区三区91| 亚洲第一页在线| 欧美激情一区二区| 欧美国产综合视频| 久久九九电影| 午夜一区在线| 久久激情五月丁香伊人| 狠狠操狠狠色综合网| 国产精品一二一区| 欧美日韩国产黄| 欧美日韩系列| 国产亚洲一本大道中文在线| 国产一区二区三区不卡在线观看| 国产欧美 在线欧美| 在线观看成人av| 亚洲一区二区精品在线| 午夜精品影院| 久久久精品午夜少妇| 久久久精品欧美丰满| 亚洲国产日韩在线| 亚洲春色另类小说| 精品成人乱色一区二区| 狠狠色丁香久久综合频道| 欧美日韩精品在线视频| 国产伦精品一区二区三区免费 | 亚洲国产精品久久91精品| 欧美午夜精品久久久久久人妖| 欧美一级午夜免费电影| 欧美日韩福利视频| 裸体丰满少妇做受久久99精品| 欧美在线看片a免费观看| 免费欧美日韩| 午夜电影亚洲| 美日韩精品免费| 国产在线拍偷自揄拍精品| 亚洲国产日韩欧美综合久久| 亚洲性感美女99在线| 蜜月aⅴ免费一区二区三区 | 久久亚洲精品一区二区| 美女诱惑黄网站一区| 亚洲人成欧美中文字幕| 欧美影院久久久| 欧美日本一区二区三区 | 欧美日韩激情小视频| 亚洲五月婷婷| 亚洲精品国产系列| 亚洲国产欧美久久| 男同欧美伦乱| 蜜乳av另类精品一区二区| 国产精品免费看| aa国产精品| 亚洲国产精品久久久久秋霞不卡| 欧美另类高清视频在线| 西西人体一区二区| 一区二区三区四区五区精品视频| 国产精品久久久久久影视| 亚洲一区国产一区| 久久亚洲影音av资源网| 国产亚洲一区二区三区在线播放| 蜜臀av国产精品久久久久| 亚洲综合清纯丝袜自拍| 国产精品自拍三区| 亚洲第一二三四五区| 久久理论片午夜琪琪电影网| 亚洲欧美在线一区| 欧美乱妇高清无乱码| 久久久久国产精品一区三寸| 久久se精品一区二区| 夜夜夜久久久| 欧美好吊妞视频| 久久av一区二区三区| 美国成人毛片| 亚洲在线成人| 欧美激情区在线播放| 久久阴道视频| 国产精品一区一区三区| 久久久夜夜夜| 亚洲美女在线观看| 国产精品久久久91| 亚洲精品自在久久| 欧美aaaaaaaa牛牛影院| 亚洲区中文字幕| 99国产成+人+综合+亚洲欧美| 亚洲黑丝在线| 欧美专区18| 久久久久欧美精品| 久久久久久久久久久成人| 国产日韩视频| 久久久久久香蕉网| 久久久久网址| 亚洲人成在线影院| 欧美午夜理伦三级在线观看| 在线亚洲自拍| 玖玖玖免费嫩草在线影院一区| 国产午夜精品一区二区三区视频| 欧美成人久久| 久久精品30| 夜夜狂射影院欧美极品| 先锋影音网一区二区| 亚洲精品在线三区| 伊人成人网在线看| 国产精品久久一区主播| 久久免费高清视频| 亚洲专区在线| 99国产精品视频免费观看一公开 | 久久er99精品| 免费观看国产成人| 日韩视频永久免费观看| 国产精品日韩欧美大师| 欧美激情小视频| 亚洲天堂成人在线视频| 美女视频黄 久久| 久久久久久电影| 激情亚洲成人| 91久久精品国产| 欧美精品手机在线| av不卡在线看| 欧美日韩免费观看一区二区三区| 午夜精品久久久久久99热软件| 欧美一区二区精美| 麻豆精品一区二区av白丝在线| 中文国产成人精品久久一| 亚洲精品视频免费观看| 在线亚洲免费| 欧美福利网址| 欧美成人亚洲成人日韩成人| 免费成人美女女| 欧美精品在线网站| 欧美一级久久久久久久大片| 久久久夜色精品亚洲| 欧美日韩在线一区二区| 国产精品视频一二三| 亚洲免费成人| 亚洲欧美日韩一区二区在线| 亚洲丰满在线| 91久久精品一区二区别| 亚洲影院高清在线| 久久精品国产成人| 国产精品免费看久久久香蕉| 亚洲国产精品999| 99国产精品视频免费观看一公开| 亚洲欧美日韩国产成人精品影院| 免费高清在线一区| 91久久视频| 亚洲综合视频1区| 欧美午夜精品电影| 亚洲天堂视频在线观看| 亚洲一区国产一区| 久久婷婷麻豆| 欧美福利视频一区| 亚洲一二三区视频在线观看| 欧美激情在线免费观看| 久久综合色播五月| 国产一区二区久久精品| 久久爱www久久做| 欧美一区二区三区视频免费| 国产亚洲欧美一区在线观看| 亚洲欧美日韩国产中文 | 亚洲一区高清| 免费观看30秒视频久久| 国产午夜精品全部视频在线播放| 日韩一级不卡| 日韩视频精品在线| 国产精品伦理| 久久精品日产第一区二区| 久久久女女女女999久久| 99在线精品免费视频九九视| 亚洲精品在线三区| 国产日韩精品一区二区三区| 小处雏高清一区二区三区| 亚洲第一视频网站| 91久久精品国产91性色| 欧美成人精品激情在线观看| 欧美成人综合| 麻豆精品在线视频| 国产欧美一区二区三区沐欲| 欧美国产一区二区在线观看|