Compartilhar via


Classe CComMultiThreadModel

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

Sintaxe

class CComMultiThreadModel

Membros

Typedefs públicos

Nome 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

Nome Descrição
CComMultiThreadModel::Decrement (Estático) Decrementa o valor da variável especificada de maneira thread-safe.
CComMultiThreadModel::Increment (Estático) Incrementa o valor da variável especificada de maneira thread-safe.

Comentários

Normalmente, você usa CComMultiThreadModel por meio de um dos dois nomes typedef, [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel ou [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel. A classe referenciada para cada typedef depende do modelo de threading usado, conforme mostrado na tabela a seguir:

typedef Threading simples Threading de apartamento Threading livre
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

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

Requisitos

Cabeçalho: atlbase.h

CComMultiThreadModel::AutoCriticalSection

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

typedef CComAutoCriticalSection AutoCriticalSection;

Comentários

CComSingleThreadModel e CComMultiThreadModelNoCS também contêm definições para AutoCriticalSection. A seguinte tabela 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 typedef CriticalSection. Você não deverá 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 após CComObjectRootEx e 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 seguintes tabelas 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 único ou de apartamento Threading livre
InternalAddRef O incremento não é thread-safe. O incremento é thread-safe.
Lock Não faz nada. Não há nenhuma seção crítica a ser bloqueada. A seção crítica está bloqueada.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

Método Threading único ou de apartamento Threading livre
InternalAddRef O incremento não é thread-safe. O incremento é thread-safe.
Lock Não faz nada. Não há nenhuma seção crítica a ser bloqueada. Não faz nada. Não há nenhuma seção crítica a ser bloqueada.

CComMultiThreadModel::CriticalSection

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

typedef CComCriticalSection CriticalSection;

Comentários

CComSingleThreadModel e CComMultiThreadModelNoCS também contêm definições para CriticalSection. A seguinte tabela 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 typedef AutoCriticalSection. Você não deverá especificar AutoCriticalSection em objetos globais ou membros de classe estática se quiser eliminar o código de inicialização CRT.

Exemplo

Confira CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::Decrement

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

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

Parâmetros

p
[entrada] Ponteiro para a variável a ser decrementada.

Valor de retorno

Se o resultado do decremento for 0, Decrement retornará 0. Se o resultado do decremento for diferente de zero, o valor retornado também será diferente de zero, mas poderá não ser igual ao resultado do decremento.

Comentários

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

CComMultiThreadModel::Increment

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

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

Parâmetros

p
[entrada] 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 retornado também será diferente de zero, mas poderá 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 typedef ThreadModelNoCS faz referência à classe CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Comentários

CComMultiThreadModelNoCS fornece métodos thread-safe para incrementar e decrementar uma variável. No entanto, ele não fornece uma seção crítica.

CComSingleThreadModel e CComMultiThreadModelNoCS também contêm definições para ThreadModelNoCS. A seguinte tabela 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

Confira CComMultiThreadModel::AutoCriticalSection.

Confira também

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