ThreadManager分析

来源:互联网 发布:log4j json格式化 编辑:程序博客网 时间:2024/06/16 11:17

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

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
原创粉丝点击