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

1.线程锁的类型

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

 

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

 

3.ATL线程模型定义

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


其中有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()操作都和独立激活时候完全不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值