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