CComMultiThreadModel::AutoCriticalSection

在使用 CComMultiThreadModel时,typedef 名称 AutoCriticalSection 引用选件类 CComAutoCriticalSection,来获取和释放一临界区对象的所有权的方法。

typedef CComAutoCriticalSection AutoCriticalSection;

备注

CComSingleThreadModelCComMultiThreadModelNoCS 还包含 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

请参见

参考

CComMultiThreadModel选件类

CComObjectThreadModel

CComGlobalsThreadModel

CComMultiThreadModel::ThreadModelNoCS