Clase CComMultiThreadModel
CComMultiThreadModel
proporciona métodos seguros para subprocesos para aumentar y disminuir el valor de una variable.
class CComMultiThreadModel
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. |
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. |
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).
Encabezado: atlbase.h
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;
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.
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:
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. |
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. |
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;
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.
Consulte CComMultiThreadModel::AutoCriticalSection.
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 ();
p
[in] Puntero a la variable que se va a disminuir.
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.
InterlockedDecrement
impide que más de un subproceso use esta variable de forma simultánea.
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 ();
p
[in] Puntero a la variable que se va a aumentar.
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.
InterlockedIncrement
impide que más de un subproceso use esta variable de forma simultánea.
Cuando se usa CComMultiThreadModel
, el nombre ThreadModelNoCS
de typedef
hace referencia a la clase CComMultiThreadModelNoCS.
typedef CComMultiThreadModelNoCS ThreadModelNoCS;
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 |
Consulte CComMultiThreadModel::AutoCriticalSection.
CComSingleThreadModel (clase)
CComAutoCriticalSection (clase)
CComCriticalSection (clase)
Información general sobre la clase