7

WebRTC 临界锁实现

 3 years ago
source link: https://mthli.xyz/webrtc-criticalsection/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
WebRTC 临界锁实现
Matthew Lee
Yet another blog of Matthew Lee 👀
Full-Stack Developer, good at Android 🤖️

WebRTC 临界锁实现

May 23, 2021

最新内容和勘误请参见笔者撰写的线上书籍《WebRTC 学习指南》

在阅读 WebRTC 源码过程中,经常可以看到 rtc::CritScope 相关的代码调用,例如:

rtp_video_sender.cc
void RtpVideoSender::SetFecAllowed(bool fec_allowed) {
  rtc::CritScope cs(&crit_); // rtc::CriticalSection crit_;  fec_allowed_ = fec_allowed;
}

笔者目前的主力语言还不是 C++,所以第一次见到这种加锁机制还挺新鲜的。事实上笔者刚开始甚至以为这只是创建了一个 cs 变量,然后什么都不做,不知道这样的代码有什么意义。

但这其实是 C++ 编程的小技巧。我们先来看看 rtc::CritScope 的具体实现:

critical_section.cc
// CritScope 只有构造函数和析构函数两个定义;
// CriticalSection 在不同平台上的实现不一样,
// 对于 POSIX 而言实现为 mutable pthread_mutex_t mutex_;
CritScope::CritScope(const CriticalSection* cs) : cs_(cs) {
  cs_->Enter(); // pthread_mutex_lock(&mutex_);
}
CritScope::~CritScope() {
  cs_->Leave(); // pthread_mutex_unlock(&mutex_);
}

在 C++ 中,函数内部的局部变量会在该函数退出时进行析构(不论是否有异常)。通过在局部变量的构造函数中加锁,在析构函数中解锁,可以有效创造出一段函数生命周期内的临界区,而不用撰写类似 Java ReentrantLock 的 try-finally 释放锁的冗余代码:

ReentrantLock
class X {
  private final ReentrantLock lock = new ReentrantLock();
  // ...

  public void m() {
    lock.lock();  // block until condition holds
    try {
      // ... method body
    } finally {
      lock.unlock()
    }
  }
}

更进一步来说,这其实是 C++ RAII(资源获取即初始化,Resource Acquisition Is Initialization)机制的一种使用场景。RAII 可以保证在释放资源时不受到异常退出的影响(即使发生了异常,也能正确释放资源);同时还能预防编码过程忘记释放资源的行为。在笔者看来,RAII 是比 Golang 的 defer 机制更加简洁的存在,哈哈。


Recommend

  • 115
    • www.jianshu.com 6 years ago
    • Cache

    WebRTC音频引擎实现分析 - 简书

    WebRTC的音频引擎作为两大基础多媒体引擎之一,实现了音频数据的采集、前处理、编码、发送、接收、解码、混音、后处理、播放等一系列处理流程。本文在深入分析WebRTC源代码的基础上,学习并总结其音频引擎的实现框架和细节。 1. WebRTC音频引擎整体架构 WebRTC音频...

  • 38
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    在WebRTC上实现ML Kit笑容检测

  • 59
    • www.10tiao.com 6 years ago
    • Cache

    踩坑记:临界区内要小心

    点击上方蓝色文字“后端技术小黑屋”,关注茄子拯救世界的公众号吧~ 这周对一个服务进行了升级,结果踩了一个不大不小的坑。 先介绍下这个服务的...

  • 31

  • 62
    • www.cocoachina.com 6 years ago
    • Cache

    基于WebRTC实现iOS端音频降噪功能

    WebRTC下载要很麻烦,并且学会使用一个库也要花费不少时间,另一方面导入一个第三方库app的体积会加大,因此用了一位大神从WebRTC提出来的模块,但因为是c的所以还要转一次。 WebRTC降噪有两部分代码,一套是定点算法(noise_sup...

  • 46

     文章转载自 WebRTC 中文网,原作者Dan JenkinWeb 平台上的 WebRTC 并不是其唯一的媒体 API。WebVR 说明书于几年前被引入来为浏览器中的虚拟现实设备提供支持。目前已经变为新的 WebXR设备API说明书。Da

  • 64
    • www.yinchengli.com 5 years ago
    • Cache

    实现WebRTC P2P连接

    WebRTC是为了解决实时音视频传输问题,致力于提供免安装、免插件、免专利费,人人可用的高效便捷的实时流媒体传输。 1. 3种实时流媒体实现比较 目前实时流媒体主流有三种实现方式:WebRTC、HLS、RTMP,当你看直播网站...

  • 8

    中金:全球电动突破临界,明年有望千万销量 1小时前 2,648 本文来自:中金点睛 全球新能源汽车销量与渗透率加速提升,根据S型增长曲线经验,及最新产业链指引,预计2022...

  • 3

    摘要:一次仅允许一个进程使用的资源称为临界资源。 本文分享自华为云社区《

  • 4

    冲击亚马逊!沃尔玛与亚马逊的电商大战接近临界点了!紫鸟浏览器酷鸟跨境浏览器

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK