webrtc Thread 和 TaskQueue 的 应用和思考
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文件还可以减少潜在的安全风险。
相关文章:
webrtc Thread 和 TaskQueue 的 应用和思考
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()…...
无涯教程-Perl - pos函数
描述 此函数用于查找最后匹配的子字符串的偏移量或位置。如果指定了SCALAR,它将返回该标量变量上最后一个匹配项的偏移量。 您还可以为此函数分配一个值(例如pos($foo) 20;),以更改下一个匹配操作的起点。 偏移是从第零位置开始的计数器。 语法 以下是此函数的简单语法- …...
【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建Java、Python项目
文章目录 一、云IDE1、云IDE简介2、云IDE和云虚拟桌面区别 二、Cloud Studio 简介1、简介2、AI代码助手3、企业源代码安全 三、快速开始1、登录Cloud Studio2、新建工作空间3、代码空间 四、项目构建1、构建Java项目1.1 新建工作空间1.2 初始化项目1.3 初始化小案例1.4、测试Ja…...
Java的Class类:每一个类都对应着一个Class对象
Class类的基本概念 在Java中,每一个类都对应着一个Class对象,这个Class对象包含了类的相关信息,例如类的名称、继承关系、方法、字段、注解等信息。通过Class对象,可以获取类的各种信息并对其进行操作。 请细品这句话࿱…...
JavaScript预编译机制
变量预编译 任何变量,如果未经声明就赋值,此变量是属于 window 的属性,而且不会做变量提升,无论在哪个作用域内赋值。比如说直接写 console.log(a)肯定会报错,提示找不到 a。但如果直接写 a 100就不会报错࿰…...
【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】
文章目录 GCC likely与unlikely 介绍linux 内核中的 likely/unlikely 上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍 下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 GCC likely与unlikely 介绍 likely 和 unlikely …...
《算法竞赛·快冲300题》每日一题:“造电梯”
《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 造…...
NSS [MoeCTF 2022]baby_file
NSS [MoeCTF 2022]baby_file 题目源码直接给了 使用data伪协议发现被ban了。 那就换一种伪协议php://filter,猜测flag在同目录下flag.php中或根目录下/flag中 php://filter/readconvert.base64-encode/resourceflag.php读取文件源码(针对php文件需要ba…...
喜报!诚恒科技与赛时达科技达成BI金蝶云星空项目合作
随着全球数字化浪潮轰轰烈烈袭来,仅仅凭借手工处理的方式难以在庞大的数据海洋中精准获取信息、把握市场需求、了解目标用户,为企业创新提供强有力的支持。深圳赛时达科技有限公司(简称赛时达科技)希望通过数字化转型实现从手工处…...
Vscode python调试和运行环境设置
Vscode python调试和运行环境设置 文章目录 Vscode python调试和运行环境设置前言一、是否为每次运行python程序都要选择环境烦恼二、是否为python程序调试不能进标准/第三方库而烦恼 前言 一、是否为每次运行python程序都要选择环境烦恼 在.vscode文件夹(没有就自己造一个)下…...
lua中执行luci.sys.call、luci.sys.exec、os.execute的区别
相同点:都是调用Linux底层脚本及程序 不同点: (1)luci.sys.call(command) 脾气捉摸不透,实际使用有些时候没有得到任何状态或数据返回,纯粹被用了一下。 (2)luci.sys.exec(command) …...
Python-OpenCV中的图像处理-模板匹配
Python-OpenCV中的图像处理-模板匹配 模板匹配单对象的模板匹配多对象的模板匹配 模板匹配 使用模板匹配可以在一幅图像中查找目标函数: cv2.matchTemplate(), cv2.minMaxLoc()模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提…...
模拟队列(c++题解)
实现一个队列,队列初始为空,支持四种操作: push x – 向队尾插入一个数 xx;pop – 从队头弹出一个数;empty – 判断队列是否为空;query – 查询队头元素。 现在要对队列进行 MM 个操作,其中的…...
Redis_哨兵模式
9. 哨兵模式 9.1 简介 当主库宕机,在从库中选择一个,切换为主库。 问题: 主库是否真正宕机?哪一个从库可以作为主库使用?如何实现将新的主库的信息通过给从库和客户端? 9.2 基本流程 哨兵主要任务: 监控选择主库通知 会有…...
Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?
索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1. 限制索引的大小:可以…...
MySQL 约束
查看约束 select * from information_schema.table_constraints where table_name要查看的表名按约束的作用范围 列级约束: 将此约束声明在对应字段的后面 表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束,可以声…...
unity实现角色体力功能【体力条+体力计算】
导读:实现功能 1、角色体力计算 2、角色疲劳动画 3、体力条制作、跟随 默认做好角色的idle/run/walk动画、切换和玩家输入,我使用的是新输入系统,动画时单变量混合树,参数Sports。 【每一部分功能根据自己需求观看哦】 1、角色体…...
【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(1/2)
一、说明 在本文中,讨论了深度学习中使用的所有常见损失函数,并在NumPy,PyTorch和TensorFlow中实现了它们。 二、内容提要 我们本文所谈的代价函数如下所列: 均方误差 (MSE) 损失二进制交叉熵损失加权二进…...
七夕好物分享,哪些礼物适合送男/女朋友?这几款好物最为合适!
七夕是个值得纪念的日子,牛郎织女鹊桥相会的故事百年流传,七夕是一个表达爱意的节日,送礼物是必不可少的,情侣们可以选择一份有意义的礼物,也可以选择对方需要的东西当做礼物来赠送,总的来说,送…...
C语言学习系列-->看淡指针(2)
文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实,可不敢说自己C语言基础学的好 一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
