CComMultiThreadModel::AutoCriticalSection
在使用 CComMultiThreadModel时,typedef 名称 AutoCriticalSection 引用选件类 CComAutoCriticalSection,来获取和释放一临界区对象的所有权的方法。
typedef CComAutoCriticalSection AutoCriticalSection;
备注
CComSingleThreadModel 和 CComMultiThreadModelNoCS 还包含 AutoCriticalSection的定义。下表显示 AutoCriticalSection和临界区选件类之间的关系引用的线程处理模型选件类:
定义的选件类 |
引用的选件类 |
---|---|
CComMultiThreadModel |
CComCriticalSection |
CComSingleThreadModel |
CComFakeCriticalSection |
CComMultiThreadModelNoCS |
CComFakeCriticalSection |
除了 AutoCriticalSection外,还可以使用 typedef 名称 CriticalSection。如果要消除CRT启动代码,您可以在全局对象或静态选件类成员不应指定 AutoCriticalSection。
示例
下面的代码在 CComObjectRootEx后模型,并演示用于线程处理环境的 AutoCriticalSection。
template< class ThreadModel >
class CMyAutoCritClass
{
public:
typedef ThreadModel _ThreadModel;
typedef typename _ThreadModel::AutoCriticalSection _CritSec;
CMyAutoCritClass() : m_dwRef(0) {}
ULONG InternalAddRef()
{
return _ThreadModel::Increment(&m_dwRef);
}
ULONG InternalRelease()
{
return _ThreadModel::Decrement(&m_dwRef);
}
void Lock() { m_critsec.Lock( ); }
void Unlock() { m_critsec.Unlock(); }
private:
_CritSec m_critsec;
LONG m_dwRef;
};
下表基于应用程序和线程处理模型演示 InternalAddRef 和 Lock 方法的结果,使用的 ThreadModel 模板参数:
ThreadModel = CComObjectThreadModel
方法 |
单个或单元线程处理 |
释放线程处理 |
---|---|---|
InternalAddRef |
该递增不是线程安全的。 |
该增量是线程安全的。 |
Lock |
不执行;没有临界区锁定。 |
临界区锁定。 |
ThreadModel = CComObjectThreadModel::ThreadModelNoCS
方法 |
单个或单元线程处理 |
释放线程处理 |
---|---|---|
InternalAddRef |
该递增不是线程安全的。 |
该增量是线程安全的。 |
Lock |
不执行;没有临界区锁定。 |
不执行;没有临界区锁定。 |
要求
Header: atlbase.h