关于调用 PeerConnectionFactory::Initialize() 时的线程切换疑问

来源:6-6 编解码器信息的收集之二

奕帝传说_梦

2024-09-20

在 WebRTC 中,在创建完 PeerConnectionFactory 之后,会执行

	  MethodCall<PeerConnectionFactory, bool> call(
	      pc_factory.get(), &PeerConnectionFactory::Initialize);
	  bool result = call.Marshal(RTC_FROM_HERE, pc_factory->signaling_thread());

这一段代码做的是线程切换,切换到 signaling_thread 来执行 PeerConnectionFactory::Initialize 函数,且它调用的是 call.Marshal,这是一个同步调用(底层调用 Invoke 方法),因此当前线程会卡在这一直直到该命令执行完毕。
然而,在构造 PeerConnectionFactory 的构造函数中,我们把 signaling_thread 赋值的是当前线程(如果不手动构造 signaling 线程,即传参值为 nullptr):

if (!signaling_thread_) {
    signaling_thread_ = rtc::Thread::Current();
    if (!signaling_thread_) {
      // If this thread isn't already wrapped by an rtc::Thread, create a
      // wrapper and own it in this class.
      signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
      wraps_current_thread_ = true;
    }
  }

根据这种写法,我们调用 call.Marshal 的时候不应该一直卡死在这里吗?因为我们当前线程被同步调用所阻塞,而当前线程有需要去处理 PeerConnectionFactory::Initialize 函数。

写回答

1回答

李超

2024-09-20

不会卡死,call.Marshal 调用后,在其内部会切换线程,切换完成后,接着执行这个函数下面的代码,你可以看到它有一个...HERE的宏,就是告诉切换晚线程后在切换后的线程中从什么地方开始执行。至于线程的切换,如果现在已经在需要切换的线程中了,它会接着执行。这些分析在线程那一章里都有讲,包括webrtc 内部是如何切换线程的, 切换线程后如何做都讲了

0
1
奕帝传说_梦
看明白了,谢谢老师
2024-09-23
共1条回复

WebRTC源码级深度解析,进阶大厂高级音视频开发者

音视频领域资深讲师授课,带你领略优秀开源库精妙所在

652 学习 · 256 问题

查看课程