Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Classe
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 objetoCCriticalSectionquando for necessário. Após um retorno bem-sucedido do construtor, bloqueie explicitamente o objeto com uma chamada paraLock. ChameUnlockquando 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étodoLockeUnlock, 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
dwTimeoutLock 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.