文章目录
在WebRTC中,会单独创建线程用于处理即时任务和延迟任务。其他线程可以将待做的事包装成任务投递到该线程去,由该线程执行。这个线程只做一件事,就是循环的处理任务。
TaskQueue使用示例
工程
先创建一个工程用于运行示例。如何创建工程,参考《WebRTC源码分析之工程-project》,在src\examples\BUILD.gn中添加如下内容:
rtc_executable("webrtc_learn"){
testonly = true
sources = [
"webrtclearn/main.cc"
]
deps = [
"../rtc_base:rtc_base",
"../rtc_base:rtc_task_queue_stdlib",
"../api/task_queue:task_queue"
]
}
示例
#include <iostream>
#include <string>
#include "rtc_base/task_queue.h"
#include "rtc_base/task_queue_stdlib.h"
#include "rtc_base/platform_thread.h"
#include "api/task_queue/queued_task.h"
#include "api/task_queue/task_queue_base.h"
#include "api/task_queue/task_queue_factory.h"
using namespace std;
using namespace webrtc;
using namespace rtc;
/*定义即时任务*/
class instant_task :public QueuedTask
{
public:
instant_task(string thread_name)
:thread_name_(thread_name)
{
}
bool Run() override
{
cout << thread_name_ << " post a task..." << endl;
return true;
}
private:
string thread_name_;
};
/*定义延迟任务*/
class delay_task : public QueuedTask
{
public:
delay_task(string thread_name)
: thread_name_(thread_name)
{
}
bool Run() override
{
cout << thread_name_ << " post a task..." << endl;
return true;
}
private:
string thread_name_;
};
void other_thread(void* arg)
{
TaskQueue* tq = (TaskQueue*)arg;
unique_ptr<QueuedTask> instantTask(new instant_task("child_thread"));
unique_ptr<QueuedTask> delayedTask(new delay_task("child_thread"));
/*延迟任务3秒后执行*/
tq->PostDelayedTask(std::move(delayedTask), 3 * 1000);
/*这个任务是最先执行*/
tq->PostTask(std::move(instantTask));
/*睡眠5秒等待任务被执行*/
Sleep(5000);
}
int main()
{
/*定义一个工厂*/
unique_ptr<TaskQueueFactory> tqFactory = CreateTaskQueueStdlibFactory();
/*用工厂创建任务队列*/
unique_ptr<TaskQueueBase, TaskQueueDeleter> tqb = tqFactory->CreateTaskQueue("task queue", TaskQueueFactory::Priority::NORMAL);
/*托管任务队列*/
TaskQueue tq(std::move(tqb));
/*开启一个子线程*/
PlatformThread other_th(other_thread, (void*)&tq, "child_thread");
other_th.Start();
/*睡眠1秒后投递任务*/
Sleep(1000);
/*投递即时任务*/
unique_ptr<QueuedTask> task(new instant_task("main_thread"));
tq.PostTask(std::move(task));
/*回收线程*/
other_th.Stop();
return 0;
}


在创建任务队列时,会创建一个线程,这个线程只用于任务的处理,其他线程可以向其投递任务。在主线程中又创建了一个子线程,并将任务队列传入,在子线程也可以向其投递任务。
TaskQueue源码分析
类关系图

TaskQueueBase类
TaskQueueBase类所在文件的位置:src\api\task_queue\task_queue_base.h task_queue_base.cc
声明
class RTC_LOCKABLE TaskQueueBase
{
public:
/*释放任务队列*/
virtual void Delete() = 0;
/*投递即时任务*/
virtual void PostTask(std::unique_ptr<QueuedTask> task) = 0;
/*投递延迟任务*/
virtual void PostDelayedTask(std::unique_ptr<QueuedTask> task,uint32_t milliseconds) = 0;
/*返回当前线程保存的任务队列*/
static TaskQueueBase* Current();
/*判断当前线程保存的任务队列是否是自己*/
bool IsCurrent()

本文深入解析 WebRTC 中的 TaskQueue 机制,介绍核心类 TaskQueueStdlib 的实现细节,包括任务队列的创建、销毁、任务投递及处理流程。
最低0.47元/天 解锁文章
899





