6.3 talk_base::Thread
talk_base::Thread的主要功能是封装线程,为线程提供消息队列和多路信号分离器的功能。需要注意的是,talk_base::Thread的绝大多数功能是talk_base::MessageQueue和talk_base::PhysicalSocketServer的代码提供的,仅有talk_base::Thread::Send函数的功能主要由talk_base::Thread的代码提供。
talk_base::Thread的主要组件包括:
sendlist_:通过talk_base::Thread::Send函数请求处理的消息列表
running_:标示系统线程是否在正在运行的talk_base::Event,该成员变量表示线程正在运行
thread_:保存系统的线程句柄/pthread_t对象
owned_:标示talk_base::Thread对象是否是线程的所有者,该变量的语义和大家的直觉可能很不一样(至少和我的直觉不一样,造成了不少麻烦)。由talk_base::Thread::Start函数启动的系统线程,该成员变量为true;通过talk_base::Thread::WrapCurrent函数包装的线程为false。并不是talk_base::Thread实例对应的哪个线程就占有(own)哪个线程,甚至有些情况下talk_base::Thread实例是唯一的封装系统线程的实例,并通过talk_base::Thread::WrapCurrent设置到了TLS中去,但是这个实例依然不占有系统线程。唯有通过talk_base::Thread::Start函数启动的系统线程,该实例才占有那个系统线程。这个概念很重要,它会影响很多函数的行为。