Compartir a través de


Clase CComMultiThreadModel

CComMultiThreadModel proporciona métodos seguros para subprocesos para aumentar y disminuir el valor de una variable.

Sintaxis

class CComMultiThreadModel

Miembros

Definiciones de tipos públicas

Nombre Descripción
CComMultiThreadModel::AutoCriticalSection Hace referencia a la clase CComAutoCriticalSection.
CComMultiThreadModel::CriticalSection Hace referencia a la clase CComCriticalSection.
CComMultiThreadModel::ThreadModelNoCS Hace referencia a la clase CComMultiThreadModelNoCS.

Métodos públicos

Nombre Descripción
CComMultiThreadModel::Decrement (Estático) Disminuye el valor de la variable especificada de forma segura para los subprocesos.
CComMultiThreadModel::Increment (Estático) Aumenta el valor de la variable especificada de forma segura para los subprocesos.

Comentarios

Normalmente, se usa CComMultiThreadModel mediante uno de dos nombres typedef, ya sea [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel o [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel. La clase a la que hace referencia cada typedef depende del modelo de subprocesos usado, como se muestra en la tabla siguiente:

typedef Subproceso único Apartamento de subproceso Subprocesamiento libre
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel como tal define tres nombres de typedef. Clases de referencia AutoCriticalSection y CriticalSection que proporcionan métodos para obtener y liberar la propiedad de una sección crítica. ThreadModelNoCS hace referencia a la clase [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Requisitos

Encabezado: atlbase.h

CComMultiThreadModel::AutoCriticalSection

Cuando se usa CComMultiThreadModel, el nombre AutoCriticalSection de typedef hace referencia a la clase CComAutoCriticalSection, que proporciona métodos para obtener y liberar la propiedad de un objeto de sección crítico.

typedef CComAutoCriticalSection AutoCriticalSection;

Comentarios

CComSingleThreadModel y CComMultiThreadModelNoCS también contienen definiciones para AutoCriticalSection. En la tabla siguiente se muestra la relación entre la clase de modelo de subprocesos y la clase de sección crítica a la que hace referencia AutoCriticalSection:

Clase definida en Clase a la que se hace referencia
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Además de AutoCriticalSection, puede usar el nombre de typedef CriticalSection. No debe especificar AutoCriticalSection en objetos globales o miembros de clase estática si desea eliminar el código de inicio de CRT.

Ejemplo

El código siguiente se modela después de CComObjectRootEx y muestra cómo se usa AutoCriticalSection en un entorno de subprocesos.

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;

En las tablas siguientes se muestran los resultados de los métodos InternalAddRef y Lock, en función del parámetro ThreadModel de plantilla y del modelo de subprocesos usado por la aplicación:

ThreadModel = CComObjectThreadModel

Método Subprocesamiento individual o de apartamento Subprocesamiento libre
InternalAddRef El aumento no es seguro para subprocesos. El aumento es seguro para subprocesos.
Lock No hace nada; no hay que bloquear ninguna sección crítica. La sección crítica está bloqueada.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

Método Subprocesamiento individual o de apartamento Subprocesamiento libre
InternalAddRef El aumento no es seguro para subprocesos. El aumento es seguro para subprocesos.
Lock No hace nada; no hay que bloquear ninguna sección crítica. No hace nada; no hay que bloquear ninguna sección crítica.

CComMultiThreadModel::CriticalSection

Cuando se usa CComMultiThreadModel, el nombre CriticalSection de typedef hace referencia a la clase CComCriticalSection, que proporciona métodos para obtener y liberar la propiedad de un objeto de sección crítico.

typedef CComCriticalSection CriticalSection;

Comentarios

CComSingleThreadModel y CComMultiThreadModelNoCS también contienen definiciones para CriticalSection. En la tabla siguiente se muestra la relación entre la clase de modelo de subprocesos y la clase de sección crítica a la que hace referencia CriticalSection:

Clase definida en Clase a la que se hace referencia
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Además de CriticalSection, puede usar el nombre de typedef AutoCriticalSection. No debe especificar AutoCriticalSection en objetos globales o miembros de clase estática si desea eliminar el código de inicio de CRT.

Ejemplo

Consulte CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::Decrement

Esta función estática llama a la función InterlockedDecrement de Win32, que disminuye el valor de la variable a la que apunta p.

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

Parámetros

p
[in] Puntero a la variable que se va a disminuir.

Valor devuelto

Si el resultado de la disminución es 0, Decrement devuelve 0. Si el resultado de la disminución es distinto de cero, el valor devuelto también es distinto de cero, pero puede no ser igual al resultado de la disminución.

Comentarios

InterlockedDecrement impide que más de un subproceso use esta variable de forma simultánea.

CComMultiThreadModel::Increment

Esta función estática llama a la función InterlockedIncrement de Win32, que aumenta el valor de la variable a la que apunta p.

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

Parámetros

p
[in] Puntero a la variable que se va a aumentar.

Valor devuelto

Si el resultado del aumento es 0, Increment devuelve 0. Si el resultado del incremento es distinto de cero, el valor devuelto también es distinto de cero, pero puede no ser igual al resultado del incremento.

Comentarios

InterlockedIncrement impide que más de un subproceso use esta variable de forma simultánea.

CComMultiThreadModel::ThreadModelNoCS

Cuando se usa CComMultiThreadModel, el nombre ThreadModelNoCS de typedef hace referencia a la clase CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Comentarios

CComMultiThreadModelNoCS proporciona métodos seguros para subprocesos para aumentar y disminuir una variable; pero no proporciona una sección crítica.

CComSingleThreadModel y CComMultiThreadModelNoCS también contienen definiciones para ThreadModelNoCS. En la tabla siguiente se muestra la relación entre la clase de modelo de subprocesos y la clase a la que hace referencia ThreadModelNoCS:

Clase definida en Clase a la que se hace referencia
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Ejemplo

Consulte CComMultiThreadModel::AutoCriticalSection.

Consulte también

CComSingleThreadModel (clase)
CComAutoCriticalSection (clase)
CComCriticalSection (clase)
Información general sobre la clase