热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【zz】webrtc线程模型

#-转载作者webrtc的base的thread,是我见过的封装最帅的c线程库,根据比qt的还好用,发个例子给你usingnamespacewebrtc

#- 转载 作者
webrtc的base的 thread,是我见过的封装最帅的c++线程库,根据比qt的还好用,发个例子给你

using namespace webrtc;
using namespace rtc;
//std::cout<<"Thread::Current()&#xff1a;" <GetId();
//Thread::Current()->Start(); 不能调用start&#xff0c;因为不是我创建的&#xff0c;他已经开始了//Thread::Current()->Run(); //阻塞当前线程进入线程循环Thread * thread &#61; new Thread();
//MyRunnable run;
//thread->Start(&run);//可以带一个Runnable参数运行,运行完就结束&#xff0c;否则运行Thread::Run进入消息循环
thread->Start();
//std::cout <<"Thread::Invoke()&#xff1a;"<Invoke(RTC_FROM_HERE, &task)<<" at " <GetId() <thread->Post(RTC_FROM_HERE, Bind(task2));//将最常用的
auto handler&#61; new MessageClient;
//thread->PostAt(RTC_FROM_HERE, (int64_t)3000,handler);
//thread->PostDelayed(RTC_FROM_HERE, (int64_t)5000, handler);
//thread->Stop();

Thread * thread2 &#61; new Thread();
thread2->Start();
thread2->Post(RTC_FROM_HERE, Bind(task2));//将最常用的
//thread2->Invoke() 非常有用&#xff0c;在任何地方可以指定我的代码运行在某个线程

//api下的proxy机制&#xff0c;实际上就是设置要执行的线程&#xff0c;然后加锁等待线程执行结果。这是我设计对外接口可以在任何线程调用而不出错的常用方法

//base的asyncinvoker与proxy类似的机制。
有ios的gdc&#xff0c;android的handler异曲同工

因为编写复杂稳定的多线程C&#43;&#43;项目实在太难&#xff0c;所以一个好的跨平台C&#43;&#43;基础库是我最求的目标,目前比较欣赏的项目有&#xff1a;

Boost:大而全&#xff0c;缺少一些可以直接上手的东西如线程消息队列&#xff0c;智能指针并非线程安全。 QT core&#xff1a;非常好 C&#43;&#43;11&#xff1a;也需要线程消息队列&#xff0c;线程安全智能指针。 chromium的base库&#xff1a;太大了 当我看到webrtc的base时&#xff0c;非常惊讶的发现它正是我想要的,特点&#xff1a;

小&#xff1a;只有几M 纯&#xff1a;基于c&#43;&#43;标准库和各操作系统sdk 跨平台 对智能指针、线程、socket封装非常好。 不断更新&#xff08;需要一直跟踪官方代码&#xff09; 移植出来单独使用&#xff0c;方案有三&#xff1a;

把源码拷贝出来用通用的编译工具&#xff08;makefile&#xff0c;cmake&#xff0c;qmake&#xff09;管理。&#xff08;makefile较复杂&#xff0c;cmake简单&#xff0c;qmake最简单&#xff09; 把源码拷贝出来用基于自带的gn管理 在webrtc项目里面编译和合并需要的静态库和pdb

因为google官方说了&#xff1a;引用计数&#43;引用计数的智能化&#xff08;scoped_ref_ptr&#xff09;&#43;弱引用就可以解决问题。 shared_ptr不是线程安全的&#xff0c;因为shared_ptr有两个成员&#xff1a;引用计数&#xff0c;和源对象指针。没办法对两个成员同时实现原子操作。 但unique_ptr是个好东西

智能指针的使用&#xff1a;

不用再使用delete。
尽量使用unique_ptr。
多个线程读写同一个 shared_ptr 对象&#xff0c;那么需要加锁。
shared_ptr 和weak_ptr配合解决循环引用的问题。
weak_ptr必须&#xff0c;oc&#xff0c;swift的ViewControler和控件都是weak关系

内存管理模型的三种级别&#xff1a; 1 手动内存管理(c/c&#43;&#43;的malloc与free&#xff0c;new与delete)&#xff1a;容易出错。 2 自动内存管理&#xff08;oc的arc&#xff0c;c&#43;&#43;的智能指针&#xff0c;scoped_ptr&#xff09;&#xff1a;存在循环引用问题&#xff0c;通过程序员自己管理强弱引用关系解决。 3 垃圾回收机制&#xff08;如java,python&#xff09;&#xff1a;后台GC降低了程序效率&#xff0c;好的程序员仍然好考虑java的强引用[表情]引用/软引用/

3 线程模型 1 生产者消费模型&#xff08;mutex&#xff0c;condition&#xff09;&#xff1a;最最常用的模型。 2 线程池模型&#xff1a;解决大量请求分配太多线程的问题。比如一个android和ios的app&#xff0c;http请求会很多很多。 3 (着重强调&#xff09;串行模型&#xff1a;ios有GCD(Grand Central Dispatch&#xff0c;global queue是线程池&#xff09;&#xff0c;android有looper&#xff0c; win32有PostMessage&#xff0c;boost有strand 读写锁&#xff1a;特别只有写才会不安全的情况。 再结合其他的手段会让程序简洁优美易读&#xff1a;java的handler&#xff0c;oc的delegate和block、swift的闭包&#xff0c;mvc模式 &#xff0c;c&#43;&#43;的function/bind/lambda&#xff0c;python和Javascript的function

而串行模型就成了解决这类多线程问题的首选&#xff0c;就是线程消息模型。 在android 系统里面&#xff0c;无数这样的例子。

模块处理线程
Call构造方法中创建module_process_thread与pacer_thread两个ProcessThread.接着为module_process_thread注册CallStats, ReceiveSideCongestionController, SendSideCongestionController模块,为pacer_thread注册PacedSender, RemoteBitrateEstimator模块.

Call::CreateVideoSendStream创建VideoSendStream时,将module_process_thread做构造参数传入,调用RegisterProcessThread方法,注册所有的rtc_rtcp模块到module_process_thread线程.同样的为VideoReceiveStream中设置.


推荐阅读
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 在 Debian 11 系统中部署 CMake 的详细步骤与最佳实践
    CMake是一个免费、开源、跨平台的工具系列,旨在构建、测试和打包软件. CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用 ... [详细]
  • PyFasterRCNN配置详解与优化指南
    本文主要讲解Faster-RCNN的配置过程,以及配置过程中遇到问题的解决方案。 1.下载工程gitclone--recursivehttps:github.comr ... [详细]
  • 如何判断电容好坏?
    关注+星标公众号,不错过精彩内容来源 | 电子电路怎样测量小容量电容的好坏?1、检测10pF以下的小电容,因10pF以下的固定电容器容量太小,如果用指针式用万用表进行测量,只能定性 ... [详细]
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • 简书: https:www.jianshu.comp5c3938ce2cf61.官网下载https:nginx.orgendownload.html  2.上传CentOS服务略3 ... [详细]
author-avatar
mobiledu2502868933
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有