Partilhar via


CComMultiThreadModel Classe

CComMultiThreadModel fornece métodos thread-safe para incrementar e diminuir o valor de uma variável.

Sintaxe

class CComMultiThreadModel

Membros

Typedefs Públicos

Designação Descrição
CComMultiThreadModel::AutoCriticalSection Classe de referências CComAutoCriticalSection.
CComMultiThreadModel::CriticalSection Classe de referências CComCriticalSection.
CComMultiThreadModel::ThreadModelNoCS Classe de referências CComMultiThreadModelNoCS.

Métodos Públicos

Designação Descrição
CComMultiThreadModel::D ecrement (Estática) Decrements o valor da variável especificada de uma maneira thread-safe.
CComMultiThreadModel::Increment (Estática) Incrementa o valor da variável especificada de uma maneira thread-safe.

Comentários

Normalmente, você usa CComMultiThreadModel através de um dos dois nomes typedef, CComObjectThreadModel ou CComGlobalsThreadModel. A classe referenciada por cada typedef depende do modelo de threading usado, conforme mostrado na tabela a seguir:

typedef Rosca única Threading de apartamento Roscagem livre
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel própria define três typedef nomes. AutoCriticalSection e CriticalSection classes de referência que fornecem métodos para obter e liberar a propriedade de uma seção crítica. ThreadModelNoCS classe de referências [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Requerimentos

Cabeçalho: atlbase.h

CComMultiThreadModel::AutoCriticalSection

Ao usar CComMultiThreadModel, o nome typedefAutoCriticalSection faz referência à classe CComAutoCriticalSection, que fornece métodos para obter e liberar a propriedade de um objeto de seção crítica.

typedef CComAutoCriticalSection AutoCriticalSection;

Comentários

CComSingleThreadModel e CComMultiThreadModelNoCS também conter definições para AutoCriticalSection. A tabela a seguir mostra a relação entre a classe de modelo de threading e a classe de seção crítica referenciada por AutoCriticalSection:

Classe definida em Classe referenciada
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Além de AutoCriticalSection, você pode usar o nome typedefCriticalSection. Você não deve especificar AutoCriticalSection em objetos globais ou membros de classe estática se quiser eliminar o código de inicialização CRT.

Exemplo

O código a seguir é modelado de acordo com CComObjectRootExe demonstra AutoCriticalSection sendo usado em um ambiente de threading.

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;

As tabelas a seguir mostram os resultados dos métodos InternalAddRef e Lock, dependendo do parâmetro de modelo ThreadModel e do modelo de threading usado pelo aplicativo:

ThreadModel = CComObjectThreadModel

Método Threading Individual ou Apartamento Threading gratuito
InternalAddRef O incremento não é thread-safe. O incremento é thread-safe.
Lock Não faz nada; Não há nenhuma seção crítica para bloquear. A secção crítica está bloqueada.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

Método Threading Individual ou Apartamento Threading gratuito
InternalAddRef O incremento não é thread-safe. O incremento é thread-safe.
Lock Não faz nada; Não há nenhuma seção crítica para bloquear. Não faz nada; Não há nenhuma seção crítica para bloquear.

CComMultiThreadModel::CriticalSection

Ao usar CComMultiThreadModel, o nome typedefCriticalSection faz referência à classe CComCriticalSection, que fornece métodos para obter e liberar a propriedade de um objeto de seção crítica.

typedef CComCriticalSection CriticalSection;

Comentários

CComSingleThreadModel e CComMultiThreadModelNoCS também conter definições para CriticalSection. A tabela a seguir mostra a relação entre a classe de modelo de threading e a classe de seção crítica referenciada por CriticalSection:

Classe definida em Classe referenciada
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Além de CriticalSection, você pode usar o nome typedefAutoCriticalSection. Você não deve especificar AutoCriticalSection em objetos globais ou membros de classe estática se quiser eliminar o código de inicialização CRT.

Exemplo

Consulte CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::D ecrement

Esta função estática chama a função Win32 InterlockedDecrement, que diminui o valor da variável apontada por p.

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

Parâmetros

p
[em] Ponteiro para a variável a ser diminuída.

Valor de retorno

Se o resultado do decréscimo for 0, então Decrement retorna 0. Se o resultado do decréscimo for diferente de zero, o valor de retorno também é diferente de zero, mas pode não ser igual ao resultado do decréscimo.

Comentários

InterlockedDecrement impede que mais de um thread use simultaneamente essa variável.

CComMultiThreadModel::Incremento

Essa função estática chama a função Win32 InterlockedIncrement, que incrementa o valor da variável apontada por p.

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

Parâmetros

p
[em] Ponteiro para a variável a ser incrementada.

Valor de retorno

Se o resultado do incremento for 0, Increment retornará 0. Se o resultado do incremento for diferente de zero, o valor de retorno também será diferente de zero, mas pode não ser igual ao resultado do incremento.

Comentários

InterlockedIncrement impede que mais de um thread use simultaneamente essa variável.

CComMultiThreadModel::ThreadModelNoCS

Ao usar CComMultiThreadModel, o nome typedefThreadModelNoCS a classe de referências CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Comentários

CComMultiThreadModelNoCS fornece métodos thread-safe para incrementar e diminuir uma variável; no entanto, não fornece uma secção crítica.

CComSingleThreadModel e CComMultiThreadModelNoCS também contêm definições para ThreadModelNoCS. A tabela a seguir mostra a relação entre a classe de modelo de threading e a classe referenciada por ThreadModelNoCS:

Classe definida em Classe referenciada
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Exemplo

Consulte CComMultiThreadModel::AutoCriticalSection.

Ver também

CComSingleThreadModel Classe
CComAutoCriticalSection Classe
Classe CComCriticalSection
Visão geral da classe