类图如下:
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