WebRTC線程運行的基本邏輯:
while(true)
{…Get(&msg, …);…Dispatch(&msg);…
}Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);…
}
在執行函數內部,就是一個while死循環,只做兩件事,從隊列里Get取出消息,然后調用Dispatch處理消息。
在Dispatch函數中會調用入參*pmsg消息的handler的OnMessage處理消息,
具體如何處理消息,每一個pmsg內部有不同的邏輯,
就是把控制權交給的發送線程,發送線程在執行時它是知道需要做什么事的,但是這個事情需要交給其他的線程來做,
但是執行線程是不知道發送線程要執行怎樣的邏輯,那么最好的方法就是發送線程將執行的邏輯寫好,執行線程只要按照發送線程的要求去執行任務就OK了。
↑
【編程思想】
因此,要弄明白正在處理的業務邏輯,必須要從發送線程著手,而不是工作線程,因為工作線程并不清楚它在做什么。
WebRTC中的具體代碼實現:
// src/rtc_base/thread.cc
Thread::Start() {pthread_ = pthread_create(PreRun);
}Thread::PreRun() {Thread *thread = static_cast<>();ThreadManager::Instance()->SetCurrentThread(thread); // 將本線程設置到ThreadManager中,與Thread對象進行綁定,這也說明綁定的時機是在pthread創建成功之后thread->Run();
}Thread::Run() {ProcessMessages(kForever);
}Thread::ProcessMessages() {while(true) {Get(&msg);Dispatch(&msg);}
}Thread::Dispatch(Message *pmsg) {pmsg->handler->OnMessage(pmsg);
}