先从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
GUI线程: 当一个线程创建window或调用GDI函数,则系统自动建立消息队列。 这没有什么好说的,没有消息循环,窗口也不会有任何反应。 非GUI线程: 默认是不会建立消息队列的,调用GetMessage会强迫系统建立消息队列。 这里要注意写法,如果像下面这样写, 程序会挂死,因为新生成的线程无法保证 立即得到调用,所以子线程的消息队列没有建立,PostMessage直接就失败了,发的这条消息也丢失了。 根据MSDN的描述,PostThreadMessage的合理使用方法是: Read More
posted @ 2010-12-09 15:53 hjtc Views(664) Comments(0) Diggs(0) Edit
开发是在windows平台下进行的,利用libjingle完成一个基本功能的客户端。 暂时链接Gtalk的服务器,以后会在本地搭建服务器。 libjingle官方下载地址: https://code.google.com/p/libjingle/1. 编译lib 首先用libjingle自带的编译环境生成lib和samples。 安装包里德readme写的很清楚了,按照上面的步骤一步一步来就是了。 注意srtp的安装,必须使用libjingle官方的srtp-cvs.zip,其他版本都是浮云。 2. 在工程中链接libjingle的lib 首先在vs中建立一个空的widnows项目,再把安装包 Read More
posted @ 2010-12-08 12:31 hjtc Views(3810) Comments(7) Diggs(0) Edit