ThreadManager分析

类图如下:
这里写图片描述

ThreadManager是采用单例模式创建的:

ThreadManager* ThreadManager::Instance() {
  RTC_DEFINE_STATIC_LOCAL(ThreadManager, thread_manager, ());
  return &thread_manager;
}

#define RTC_DEFINE_STATIC_LOCAL(type, name, arguments) \
  static type& name = *new type arguments

把宏RTC_DEFINE_STATIC_LOCAL展开,实际上为

ThreadManager* ThreadManager::Instance() {
  static ThreadManager& thread_manager= *new ThreadManager();
  return &thread_manager;
}

但从代码中可以看出,thread_manager为静态局部变量,它在该函数第一次被调用时进行初始化(在多线程环境下是否会被多次初始化?这个有待商榷)。

ThreadManager管理着每个线程的Thread*对象,保存在线程局部对象中,当Thread ThreadManager::CurrentThread()返回到总是当前线程对应的Thread. 下面看下代码实现:

#if defined(WEBRTC_WIN)
ThreadManager::ThreadManager() {
  key_ = TlsAlloc();  //在ThreadManager构造函数中申请索引
#ifndef NO_MAIN_THREAD_WRAPPING
  WrapCurrentThread();
#endif
}

ThreadManager::~ThreadManager() {
  UnwrapCurrentThread();
  TlsFree(key_);
}

Thread *ThreadManager::CurrentThread() {
  return static_cast<Thread *>(TlsGetValue(key_));  //每个线程返回对应的Thread *
}

void ThreadManager::SetCurrentThread(Thread *thread) {
  TlsSetValue(key_, thread);  //将当前线程的Thread对象指针存入线程局部对象中
}
#endif
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值