Classe CCriticalSection
Representa uma “seção crítica”, um objeto de sincronização que permite que um thread por vez acesse um recurso ou seção de código.
Sintaxe
class CCriticalSection : public CSyncObject
Membros
Construtores públicos
Nome | Descrição |
---|---|
CCriticalSection::CCriticalSection |
Constrói um objeto CCriticalSection . |
Métodos públicos
Nome | Descrição |
---|---|
CCriticalSection::Lock |
Use para obter acesso ao objeto CCriticalSection . |
CCriticalSection::Unlock |
Libera o objeto CCriticalSection . |
Operadores públicos
Nome | Descrição |
---|---|
CCriticalSection::operator CRITICAL_SECTION* |
Recupera um ponteiro para o objeto interno CRITICAL_SECTION . |
Membros de Dados Públicos
Nome | Descrição |
---|---|
CCriticalSection::m_sect |
Um objeto CRITICAL_SECTION . |
Comentários
As seções críticas são úteis quando pode ser permitido modificar dados ou algum outro recurso controlado em apenas um thread por vez. Por exemplo, adicionar nós a uma lista vinculada é um processo que só deve ser permitido a um thread por vez. Ao usar um objeto CCriticalSection
para controlar a lista vinculada, apenas um thread por vez poderá obter acesso à lista.
Observação
A funcionalidade da classe CCriticalSection
é fornecida por um objeto Win32 CRITICAL_SECTION
real.
Seções críticas são usadas em vez de mutexes (ver CMutex
) quando a velocidade for crítica e o recurso não for usado além dos limites do processo.
Há dois métodos para usar um objeto CCriticalSection
: autônomo e inserido em uma classe.
Método autônomo Para usar um objeto autônomo
CCriticalSection
, construa o objetoCCriticalSection
quando for necessário. Após um retorno bem-sucedido do construtor, bloqueie explicitamente o objeto com uma chamada paraLock
. ChameUnlock
quando terminar de acessar a seção crítica. Esse método, embora mais claro para alguém que esteja lendo o seu código-fonte, é mais propenso a erros, pois você deve se lembrar de bloquear e desbloquear a seção crítica antes e depois do acesso.Um método preferencial é usar a classe
CSingleLock
. Ele também tem um métodoLock
eUnlock
, mas você não precisa se preocupar em desbloquear o recurso se ocorrer uma exceção.Método inserido Você também pode compartilhar uma classe com vários threads adicionando um membro de dados do tipo
CCriticalSection
à classe e bloqueando o membro de dados quando necessário.
Para mais informações sobre como usar objetos CCriticalSection
, confira o artigo Multithreading: como usar as classes de sincronização.
Hierarquia de herança
CCriticalSection
Requisitos
Cabeçalho: afxmt.h
CCriticalSection::CCriticalSection
Constrói um objeto CCriticalSection
.
CCriticalSection();
Comentários
Para acessar ou liberar um objeto CCriticalSection
, crie um objeto CSingleLock
e chame suas funções membro Lock
e Unlock
. Se o objeto CCriticalSection
estiver sendo usado de maneira autônoma, chame sua função membro Unlock
para liberá-lo.
Se o construtor não alocar a memória do sistema necessária, uma exceção de memória (do tipo CMemoryException
) será gerada automaticamente.
Exemplo
Consulte o exemplo de CCriticalSection::Lock.
CCriticalSection::Lock
Chame essa função membro para obter acesso ao objeto de seção crítica.
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
Parâmetros
dwTimeout
Lock
ignora esse valor de parâmetro.
Valor de retorno
Diferente de zero se a função foi bem-sucedida, caso contrário, 0.
Comentários
Lock
é uma chamada de bloqueio que não retornará até que o objeto de seção crítica esteja sinalizado (torne-se disponível).
Se as esperas cronometradas forem necessárias, você poderá usar um objeto CMutex
em vez de um objeto CCriticalSection
.
Se Lock
não alocar a memória do sistema necessária, uma exceção de memória (do tipo CMemoryException
) será gerada automaticamente.
Exemplo
Este exemplo demonstra a abordagem de seção crítica aninhada controlando o acesso a um recurso compartilhado (o objeto estático _strShared
) usando um objeto compartilhado CCriticalSection
. A função SomeMethod
demonstra a atualização de um recurso compartilhado de maneira segura.
//Definition of critical section class
class CMyCritSectClass
{
static CString _strShared; //shared resource
static CCriticalSection _critSect;
public:
CMyCritSectClass(void) {}
~CMyCritSectClass(void) {}
void SomeMethod(void); //locks, modifies, and unlocks shared resource
};
//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;
void CMyCritSectClass::SomeMethod()
{
_critSect.Lock();
if (_strShared == "")
_strShared = "<text>";
_critSect.Unlock();
}
CCriticalSection::m_sect
Contém um objeto de seção crítico que é usado por todos os métodos CCriticalSection
.
CRITICAL_SECTION m_sect;
CCriticalSection::operator CRITICAL_SECTION*
Recupera um objeto CRITICAL_SECTION
.
operator CRITICAL_SECTION*();
Comentários
Chame essa função para recuperar um ponteiro para o objeto interno CRITICAL_SECTION
.
CCriticalSection::Unlock
Libera o objeto CCriticalSection
para uso por outro thread.
BOOL Unlock();
Valor de retorno
Não zero se o objeto CCriticalSection
tiver pertencido ao thread e a versão tiver sido bem-sucedida; caso contrário, 0.
Comentários
Se CCriticalSection
estiver sendo usada de maneira autônoma, Unlock
deverá ser chamado imediatamente após concluir o uso do recurso controlado pela seção crítica. Se um objeto CSingleLock
estiver sendo usado, CCriticalSection::Unlock
será chamada pela função membro Unlock
do objeto de bloqueio.
Exemplo
Confira o exemplo de CCriticalSection::Lock
.