ATL中的线程安全(AC9)

本文详细解析了ATL框架中实现线程安全的具体机制,包括CComSingleThreadModel、CComMultiThreadModel等线程模型及CriticalSection的不同级别。通过这些机制,开发者能够有效地处理多线程同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  AC9,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第九部分。

  ATL中的线程安全是由CXXXxxxCriticalSection提供的,使用的policy策略,使用者可以得到Lock、Unlock两个方法来处理同步问题,而且,ATL的诸多policy给使用者提供了恰好足够的线程安全。注意恰好足够的说法,也就是说首先它够用,更重要的是没有额外负担。

  本来这点东西是不足以写成单独一部分的,但是考虑到一个包括大部分模板类的部分非一时半会能写完,就先发这点写完的东西吧。

//恰好足够的线程安全

//atlbase.h



CComSingleThreadModel

CComMultiThreadModel

CComMultiThreadModelNoCS

//这三个线程模型定义了不同级别的CriticalSection,分别是(这是一组typedef,每个线程模型里都定义了这四个类型):

AutoCriticalSection

AutoDeleteCriticalSection

CriticalSection

//各个基本的CriticalSection

//atlcore.h	//在atlcore中一共定义了5个CriticalSection

class	CXXXxxxCriticalSection	//comcore这5个Section都定义了这四个方法,只不过根据不同需求有的方法不能被访问

{

public:

	HRESULT Lock() throw() { return S_OK; }

	HRESULT Unlock() throw() { return S_OK; }

	HRESULT Init() throw() { return S_OK; }

	HRESULT Term() throw() { return S_OK; }

};



CComFakeCriticalSection		//4方法都是空方法,只是提供格式上的policy,不处理线程安全问题

CComCriticalSection			//提供对CRITICAL_SECTION提供封装

CComAutoCriticalSection	:public CComCriticalSection	//Init、Term被屏蔽,构造、析够自动处理

CComSafeDeleteCriticalSection :public CComCriticalSection	//提供初始化检测

CComAutoDeleteCriticalSection :public CComSafeDeleteCriticalSection	//自动,你使用Lock、Unlock不用管其他的了

//由于历史原因,存在了这么多类,实际使用中应该优先使用 CComAutoCriticalSection



//atlbase.h

#if defined(_ATL_SINGLE_THREADED)



#if defined(_ATL_APARTMENT_THREADED) || defined(_ATL_FREE_THREADED)

#pragma message ("More than one global threading model defined.")

#endif



typedef CComSingleThreadModel CComObjectThreadModel;

typedef CComSingleThreadModel CComGlobalsThreadModel;



#elif defined(_ATL_APARTMENT_THREADED)



#if defined(_ATL_SINGLE_THREADED) || defined(_ATL_FREE_THREADED)

#pragma message ("More than one global threading model defined.")

#endif



typedef CComSingleThreadModel CComObjectThreadModel;

typedef CComMultiThreadModel CComGlobalsThreadModel;



#elif defined(_ATL_FREE_THREADED)



#if defined(_ATL_SINGLE_THREADED) || defined(_ATL_APARTMENT_THREADED)

#pragma message ("More than one global threading model defined.")

#endif



typedef CComMultiThreadModel CComObjectThreadModel;

typedef CComMultiThreadModel CComGlobalsThreadModel;



#else

#pragma message ("No global threading model defined")

#endif

//根据stdafx.h中的宏定义组件获得定义的线程模型。



CComObjectRootEx

//封装提供了恰好足够的线程安全的引用计数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值