先从ThreadManager类说起: 这是一个全局的线程管理类,在thread.cc中定义。 这个类的核心功能在于提供线程对象注册的功能。提供了一个很方便的函数CurrentThread,如下面的场景: // Check that we're being called from the channel (e.g., worker) thread. ASSERT(talk_base::ThreadManager::CurrentThread() == channel_thread_); channel_thread_-Clear(this); 注意,CurrentThread是在当前线程已经 Read More
posted @ 2010-12-14 13:38 hjtc Views(1626) Comments(0) Diggs(0) Edit
看libjingle库的过程中发现,它用了TLS机制来实现线程对象和线程的关联。这里简单记述下TLS的一些细节。 TLS(thread local sttorage), 首先看图,这是从核心编程里抠出来的。 进程会管理一个标识位组,每个标识表示一个slot(上面那个横向的框),当任意线程调用TlsAlloc时,系统都会扫描该标识位组,发现的第一个FREE标识时(可能是0),就返回该标识的索引,并将该标识设置为INUSE。这里要注意的是这个标识组是全局唯一的,也就是说如果线程1调用TlsAlloc返回3,就代表所有其他线程的索引3都被系统保留了,如果你其他线程调用TlsAlloc,你不会再或得3 Read More
posted @ 2010-12-14 10:12 hjtc Views(708) Comments(0) Diggs(0) Edit