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 支持定時器場景Post 消息,避免直接共享內存加鎖MessageHandler 存活時間長於消息投遞