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
Observação
A biblioteca Microsoft Foundation Classes (MFC) continua sendo suportada. No entanto, não estamos mais adicionando recursos ou atualizando a documentação.
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
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.