webrtc Thread 和 TaskQueue 的 應用和思考
Thread
#include "rtc_base/thread.h"void FunctionToRunOnThread() {// Your threaded logic here.printf("Function running on the thread!\n");
}int main() {rtc::Thread* thread = rtc::Thread::Create().release();thread->Start();// Send a task to the thread.thread->Invoke<void>(RTC_FROM_HERE, &FunctionToRunOnThread);// Cleanup.thread->Stop();delete thread;return 0;
}
為什么要在Create 后調用release:rtc::Thread* thread = rtc::Thread::Create().release();
這種寫法的目的是獲取std::unique_ptr
管理的原始指針,并確保std::unique_ptr
不會在作用域結束后自動刪除它。
當你調用rtc::Thread::Create()
時,這個函數返回一個std::unique_ptr<rtc::Thread>
對象。這個std::unique_ptr
對象擁有一個rtc::Thread
的實例,當這個std::unique_ptr
對象超出作用域或被銷毀時,它會自動刪除這個rtc::Thread
實例。
當你調用release()
方法時,你實際上是在告訴std::unique_ptr
放棄對rtc::Thread
的所有權。這意味著std::unique_ptr
不再擁有這個對象,并且在std::unique_ptr
銷毀時不會刪除它。這就允許你手動管理這個對象的生命周期。
** 所以 release 是 std::unique_ptr 的方法。**
TaskQueue
#include "rtc_base/task_queue.h"void FunctionToRunOnQueue() {// Your task logic here.printf("Function running on the task queue!\n");
}int main() {rtc::TaskQueue task_queue("MyTaskQueue");// Post a task to the queue.task_queue.PostTask(RTC_FROM_HERE, &FunctionToRunOnQueue);// The task queue will automatically handle the task. // For the sake of this example, just wait a bit to let the task run.rtc::Thread::Current()->SleepMs(100);return 0;
}
RTC_FROM_HERE
是 WebRTC 代碼庫中用于標識代碼位置的宏。它通常與日志、斷言和任務調度等功能一起使用,以提供源代碼中的文件名和行號信息。
例如,當你在 WebRTC 中遇到一個斷言失敗或者想要追蹤一個特定的日志事件,RTC_FROM_HERE 會提供一個表示代碼位置的rtc::Location
對象,這樣你可以知道是哪個文件的哪一行產生了這個事件或錯誤。
它的定義大致如下:
#define RTC_FROM_HERE rtc::Location(__FILE__, __LINE__)
webrtc::Thread
和 webrtc::TaskQueue
為什么不單獨編譯成so 給webrtc使用 而將 源碼集成到webrtc 中,他們不是解耦的嗎?
將webrtc::Thread
和webrtc::TaskQueue
直接集成到 WebRTC 源碼中,而不是編譯為單獨的 .so (shared object) 文件或庫,是基于幾個原因的決策:
-
緊密集成: 盡管
webrtc::Thread
和webrtc::TaskQueue
作為組件是相對獨立的,但它們與 WebRTC 的其他部分有著緊密的交互和依賴關系。將它們與核心代碼緊密集成可以確保更好的性能和優化。 -
編譯和鏈接優化: 將所有組件編譯到一個單一的二進制文件中允許編譯器進行更多的跨模塊優化。這可能會導致更快的代碼和更小的二進制大小。
-
簡化部署和分發: 不需要管理、分發和鏈接多個.so文件可以簡化應用程序的部署和分發。此外,這可以確保版本兼容性,因為所有組件都是從同一源碼樹構建的。
-
避免 ABI (Application Binary Interface) 的問題: ABI 是二進制代碼如何在運行時調用和使用的一個規范。不同的編譯器、編譯器版本或編譯器標志可能會導致不同的 ABI。將所有東西編譯到一個庫中可以避免潛在的 ABI 兼容性問題。
-
維護和開發效率: 在單一的代碼庫中工作可以簡化開發流程,特別是當需要跨多個組件進行更改時。
-
安全性: 將所有組件緊密集成可以確保一致的安全實踐和策略。此外,避免加載外部.so文件還可以減少潛在的安全風險。