CComMultiThreadModel 类

CComMultiThreadModel 提供用于递增和递减变量值的线程安全方法。

语法

class CComMultiThreadModel

成员

公共 Typedef

名称 描述
CComMultiThreadModel::AutoCriticalSection 引用类 CComAutoCriticalSection
CComMultiThreadModel::CriticalSection 引用类 CComCriticalSection
CComMultiThreadModel::ThreadModelNoCS 引用类 CComMultiThreadModelNoCS

公共方法

名称 描述
CComMultiThreadModel::Decrement (静态)以线程安全的方式递减指定变量的值。
CComMultiThreadModel::Increment (静态)以线程安全的方式增加指定变量的值。

注解

通常,可通过两个 CComMultiThreadModel 名称之一使用 typedef,即名称 [CComObjectThreadModel] (atl-typedefs.md#ccomobjectthreadmodel 或 [CComGlobalsThreadModel] (atl-typedefs.md#ccomglobalsthreadmodel。 每个 typedef 引用的类取决于使用的线程模型,如下表所示:

typedef 单线程处理 单元线程处理 免费线程处理
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel;M= CComMultiThreadModel

CComMultiThreadModel 本身定义 3 个 typedef 名称。 AutoCriticalSectionCriticalSection 引用类提供获取和释放关键节所有权的方法。 ThreadModelNoCS 引用类 [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md)。

要求

标头:atlbase.h

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;

下表显示 InternalAddRefLock 方法的结果,具体取决于应用程序使用的 ThreadModel 模板参数和线程模型:

ThreadModel = CComObjectThreadModel

方法 单线程或单元线程处理 免费线程处理
InternalAddRef 增量不是线程安全的。 增量是线程安全的。
Lock 不执行任何操作,因为没有要锁定的关键节。 关键节已锁定。

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

方法 单线程或单元线程处理 免费线程处理
InternalAddRef 增量不是线程安全的。 增量是线程安全的。
Lock 不执行任何操作,因为没有要锁定的关键节。 不执行任何操作,因为没有要锁定的关键节。

CComMultiThreadModel::CriticalSection

使用 CComMultiThreadModel 时,typedef 名称 CriticalSection 引用类 CComCriticalSection 提供获取和释放关键节对象所有权的方法。

typedef CComCriticalSection CriticalSection;

备注

CComSingleThreadModelCComMultiThreadModelNoCS 也包含 CriticalSection 的定义。 下表显示了线程模型类与 CriticalSection 引用的临界区类之间的关系:

类的定义位置 引用的类
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

除了 CriticalSection 之外,还可以使用 typedef 名称 AutoCriticalSection。 如果要消除 CRT 启动代码,则不应在全局对象或静态类成员中指定 AutoCriticalSection

示例

请参阅 CComMultiThreadModel::AutoCriticalSection

CComMultiThreadModel::Decrement

此静态函数调用 Win32 函数 InterlockedDecrement,该函数将 p 指向的变量的值递减。

static ULONG WINAPI Decrement(LPLONG p) throw ();

参数

p
[in] 指向要递减的变量的指针。

返回值

如果递减的结果为 0,则 Decrement 返回 0。 如果递减的结果为非零,则返回值也为非零,但可能不等于递减的结果。

备注

InterlockedDecrement 可防止多个线程同时使用此变量。

CComMultiThreadModel::Increment

此静态函数调用 Win32 函数 InterlockedIncrement,该函数将 p 指向的变量的值递减。

static ULONG WINAPI Increment(LPLONG p) throw ();

参数

p
[in] 指向要递增的变量的指针。

返回值

如果递增的结果为 0,则 Increment 返回 0。 如果递增的结果为非零,则返回值也为非零,但可能不等于递增的结果。

备注

InterlockedIncrement 可防止多个线程同时使用此变量。

CComMultiThreadModel::ThreadModelNoCS

使用 CComMultiThreadModel 时,typedef 名称 ThreadModelNoCS 引用类 CComMultiThreadModelNoCS

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

备注

CComMultiThreadModelNoCS 提供用于递增和递减变量的线程安全方法;但不提供关键节。

CComSingleThreadModelCComMultiThreadModelNoCS 还包含 ThreadModelNoCS 的定义。 下表显示了线程模型类与 ThreadModelNoCS 引用的类之间的关系:

类的定义位置 引用的类
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

示例

请参阅 CComMultiThreadModel::AutoCriticalSection

另请参阅

CComSingleThreadModel 类
CComAutoCriticalSection 类
CComCriticalSection 类
类概述