首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

libjingle 線程機制深度解析:Thread、MessageQueue 與消息循環

     編輯:C++ 入門

libjingle 線程機制深度解析:Thread、MessageQueue 與消息循環

核心架構

libjingle 使用 talk_base::Thread 封裝所有線程(signaling thread、worker thread 等),由 ThreadManager 統一管理。任意位置可通過 Thread::Current() 獲取當前線程指針。

消息隊列機制

Thread 繼承 MessageQueue,實現類似 Windows 消息循環的機制。核心接口:

  • Get:取出並移除消息
  • Peek:查看但不移除消息
  • Post:投遞消息
  • PostDelayed:延時投遞消息

對象若要接收消息,需繼承 MessageHandler 並實現 OnMessage(Message* msg),該方法在消息隊列分發時被調用。

兩種線程創建方式

類型用途創建與啟動
AutoThread封裝 OS 線程,自動加入線程池成為當前線程自動管理,無需手動啟動
Thread典型 worker thread創建對象 → ThreadManager::Add/SetCurrent 加入池 → Run() 進入循環或 Start() 開始監聽

跨線程消息發送示例

class Test : public talk_base::MessageHandler {
public:
    Test() : i(0) {}
    void OnMessage(talk_base::Message* pmsg) override {
        if (pmsg->message_id == 50) {
            talk_base::Thread* cur = talk_base::Thread::Current();
            printf("Thread run count=%d threadId=%d\n", ++i, cur->GetThreadId());
        }
    }
    int i;
};

int main() {
    talk_base::Thread thread;
    thread.Start(); // 啟動線程消息循環
    
    Test test;
    for (int i = 0; i < 100; ++i) {
        Sleep(30);
        thread.Post(&test, i); // 向線程投遞消息
    }
    getchar();
    return 0;
}

關鍵設計亮點

  • 線程隔離:每個線程擁有獨立消息隊列,避免鎖競爭
  • 異步解耦:生產者通過 Post 投遞消息,消費者在自身線程處理,無需同步等待
  • 類型安全:MessageHandler 虛函數保證消息分發正確性
  • 延時消息:PostDelayed 支持定時器場景

工程應用建議

  1. 耗時操作(網絡 I/O、文件讀寫、編解碼)放入 worker thread
  2. UI 更新、信令處理放入主線程
  3. 線程間通信優先使用 Post 消息,避免直接共享內存加鎖
  4. 注意對象生命週期:確保 MessageHandler 存活時間長於消息投遞
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved