前言
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 name
if (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容器中。