WebRTC源代码探索之旅——多线程篇(7 - 3)

7.3 范例代码2

 

范例代码1是一个单线程的例子,所以并不能够足以研究WebRTC在多线程环境下的工作情况。因此,在这个例子的基础上,我把它改良成了多线程的版本:


#include <string>
#include <iostream>
#include "talk/base/thread.h"
 
class HelpData : publictalk_base::MessageData
{
public:
 std::string info_;
};
 
class Police : publictalk_base::MessageHandler
{
public:
 enum {
   MSG_HELP,
  };
 
 void Help(talk_base::Thread& targetThread, const std::string&info) {
   HelpData* data = new HelpData;
   data->info_ = info;
   targetThread.Post(this, MSG_HELP, data);
  }
 
 virtual void OnMessage(talk_base::Message* msg) {
   switch (msg->message_id) {
   case MSG_HELP:
      HelpData* data = (HelpData*)msg->pdata;
     std::cout << "MSG_HELP :" << data->info_<< std::endl;
     break;
    }
  }
};
 
int main(int argc, char** argv)
{
 std::cout << "Test Multi-thread is started"<<std::endl;
 Police p;
 talk_base::Thread thread;
 thread.Start();
 
 p.Help(thread, "Please help me!");
 talk_base::Thread::Current()->SleepMs(100);
 std::cout << "Test Multi-thread is completed" <<std::endl;
 
 return 0;
}

这个版本的代码仅仅就是稍微改装了一点点,但是整个调用栈的情况发生了很大的变化:


 


从上图可以看出,虽然在多线程环境下情况复杂得多,但是WebRTC依然可以保证talk_base::ThreadManager和talk_base::MessageQueueManager这两个全局设施可以在任何子线程启动之前被构造完毕。

 

结合以上2个例子,加上本文对涉及的各个类的解说,我想应该大多数读者能够掌握WebRTC的线程模型的所有细节。如果还有什么疑问的话,那就只能靠动手才能解决问题了。请将以上两个例子编译通过并在你有疑惑的函数中设置log输出,甚至于单步调试你有疑惑的代码,是掌握代码原理的终极手段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值