现在的位置: 首页 > 综合 > 正文

ATL源码学习---线程模型支持

2013年02月23日 ⁄ 综合 ⁄ 共 5964字 ⁄ 字号 评论关闭

1.线程锁的类型

  线程锁类型有CComCriticalSection,CComAutoCriticalSection、
CComSafeDeleteCriticalSection、CComAutoDeleteCriticalSection、
CComFakeCriticalSection。每种锁都有它们的特定用途。

 

2.线程锁的封装,实现锁类型的参数化

 

3.ATL线程模型定义

ATL中把不同线程模型下引用计数的实作封装到同一个函数中:加法是Increment(),减法是Decrement()
。三个代表不同线程模型的类:CComSingleThreadModel、CComMultiThreadModel
CComMultiThreadModelNoCS
中均实作了这两个函数。这样,我们只需要把线程模型当作模板参数传递给对象,对象就能获得正确的引用计数操作动作。


其中有3种临界区
CComCriticalSection


CComAutoCriticalSection


CComFakeCriticalSection


。每一个临界区都提供了统一的4种操作来操作临界区:Lock()
Unlock()
Init()
Term()

。我们在程序中使用“临界区”时,只需要调用这四种操作就可以达到保护数据成员不被其他线程修改的目的。


 

4.服务器的默认线程模型

ATL内部使用CComObjectThreadModel来保护组件内部实例数据,CComGlobalThreadModel来保护全局和静态数据。

 

ATL提供了
CComObjectRootEx模板类,来封装上面关于引用计数的操作以及临界区的操作。只要提供给CComObjectRootEx一个代表其线程模型的模板参数,它就能实作出InternalAddRef()、InternalRelease()以及Lock()和UnLock()四个统一的操作界面。

经过了这么多层封装,ATL
已经把AddRef()和Release()所需要的操作全部实作出来了,可是ATL还是没有迈出最后的一步——没有把这些操作整合进AddRef()和
Release(),这是因为ATL还要考虑聚合的因素。在聚合的情况下,COM对象的AddRef()和Release()操作都和独立激活时候完全不同。

抱歉!评论已关闭.