Partilhar via


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 objeto CCriticalSection quando for necessário. Após um retorno bem-sucedido do construtor, bloqueie explicitamente o objeto com uma chamada para Lock. Chame Unlock 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étodo Lock e Unlock, 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

CObject

CSyncObject

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.

Confira também

Classe CSyncObject
Gráfico da hierarquia
Classe CMutex