前言


messagequeue里面的Thread,对应thread_local_storage的一个Thread。
源码分析

int PASCAL wWinMain(HINSTANCE instance,HINSTANCE prev_instance,wchar_t* cmd_line,int cmd_show) {rtc::WinsockInitializer winsock_init;rtc::Win32SocketServer w32_ss;// 创建完成时候,就已经添加到ThreadManager 了。rtc::Win32Thread w32_thread(&w32_ss);// 设置为当前线程与Win32Thread线程对象的绑定rtc::ThreadManager::Instance()->SetCurrentThread(&w32_thread);*******->ThreadManager::SetCurrentThread(Thread* thread)->void ThreadManager::SetCurrentThreadInternal(Thread* thread) {TlsSetValue(key_, thread);}
TlsSetValue函数里面的key参数值是 ThreadManager 的构造函数传入的, key(TlsAlloc()),调用TlsAlloc函数生成线程本地空间,然后调用了TlsSetValue存储thread线程指针地址到本地空间。
Win32Thread对象怎么插入到ThreadManager中?
通过查看Thread类的构造函数,可以发现构造时,最终都会调用Thread::Thread(SocketServer* ss, bool do_init)
Thread::Thread(SocketServer* ss, bool do_init)
Thread::Thread(SocketServer* ss, bool do_init): fPeekKeep_(false),delayed_next_num_(0),fInitialized_(false),fDestroyed_(false),stop_(0),ss_(ss) {RTC_DCHECK(ss);ss_->SetMessageQueue(this);SetName("Thread", this); // default nameif (do_init) {DoInit();}}
里面最关键的是调用了Thread::DoInit,里面将Thread添加到了ThreadManager线程管理中了。
Thread::DoInit
void Thread::DoInit() {if (fInitialized_) {return;}fInitialized_ = true;ThreadManager::Add(this);}
ThreadManager::Add(Thread* message_queue)
void ThreadManager::Add(Thread* message_queue) {return Instance()->AddInternal(message_queue);}void ThreadManager::AddInternal(Thread* message_queue) {CritScope cs(&crit_);// Prevent changes while the list of message queues is processed.RTC_DCHECK_EQ(processing_, 0);message_queues_.push_back(message_queue);}
最终将messagequeue添加到message_queues容器中。
