关于调用 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 内部是如何切换线程的, 切换线程后如何做都讲了
012024-09-23
相似问题