Partilhar via


CCriticalSection Classe

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Representa uma "secção crítica" — um objeto de sincronização que permite que um thread de cada vez aceda a um recurso ou secção de código.

Sintaxe

class CCriticalSection : public CSyncObject

Membros

Construtores Públicos

Nome Description
CCriticalSection::CCriticalSection Constrói um CCriticalSection objeto.

Métodos Públicos

Nome Description
CCriticalSection::Lock Use para aceder ao CCriticalSection objeto.
CCriticalSection::Unlock Liberta o CCriticalSection objeto.

Operadores Públicos

Nome Description
CCriticalSection::operator CRITICAL_SECTION* Recupera um ponteiro para o objeto interno CRITICAL_SECTION .

Membros de Dados Públicos

Nome Description
CCriticalSection::m_sect Um objeto CRITICAL_SECTION.

Observações

Secções críticas são úteis quando apenas um thread de cada vez pode ser autorizado a modificar dados ou outro recurso controlado. Por exemplo, adicionar nós a uma lista ligada é um processo que só deve ser permitido por um thread de cada vez. Ao usar um CCriticalSection objeto para controlar a lista ligada, apenas um fio de cada vez pode aceder à lista.

Observação

A funcionalidade da CCriticalSection classe é fornecida por um objeto Win32 CRITICAL_SECTION real.

As secções críticas são usadas em vez de mutexes (ver CMutex) quando a velocidade é crítica e o recurso não será usado através dos limites do processo.

Existem dois métodos para usar um CCriticalSection objeto: autónomo e embutido numa classe.

  • Método independente Para usar um objeto autónomo CCriticalSection , constrói o CCriticalSection objeto quando for necessário. Após um retorno bem-sucedido do construtor, bloqueie explicitamente o objeto com uma chamada para Lock. Liga Unlock quando terminares de aceder à secção crítica. Este método, embora mais claro para quem leia o seu código-fonte, é mais propenso a erros, pois tem de se lembrar de bloquear e desbloquear a secção crítica antes e depois do acesso.

    Um método mais preferível é usar a CSingleLock aula. Também tem um Lock método AND Unlock , mas não tens de te preocupar em desbloquear o recurso caso ocorra uma exceção.

  • Método embutido Também pode partilhar uma classe com múltiplos threads adicionando um CCriticalSectionmembro de dados de tipo à classe e bloqueando o membro de dados quando necessário.

Para mais informações sobre o uso CCriticalSection de objetos, consulte o artigo Multithreading: Como Usar as Classes de Sincronização.

Hierarquia de herança

CObject

CSyncObject

CCriticalSection

Requerimentos

Cabeçalho:afxmt.h

CCriticalSection::CCriticalSection

Constrói um CCriticalSection objeto.

CCriticalSection();

Observações

Para aceder ou libertar um CCriticalSection objeto, cria um CSingleLock objeto e chama as suas Lock funções e Unlock membros. Se o CCriticalSection objeto estiver a ser usado de forma autónoma, chame a função membro Unlock para o libertar.

Se o construtor não alocar a memória do sistema necessária, uma exceção de memória (do tipo CMemoryException) é automaticamente lançada.

Example

Veja o exemplo do CCriticalSection::Lock.

CCriticalSection::Lock

Chame esta função membro para aceder ao objeto de secção crítico.

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

Parâmetros

dwTimeout Lock ignora este valor do parâmetro.

Valor de retorno

Não nula se a função fosse bem-sucedida; caso contrário, 0.

Observações

Lock é uma chamada bloqueante que não retorna até que o objeto de secção crítica seja sinalizado (se torne disponível).

Se forem necessárias esperas cronometradas, podes usar um CMutex objeto em vez de um CCriticalSection objeto.

Se Lock não alocar a memória necessária do sistema, uma exceção de memória (do tipo CMemoryException) é automaticamente lançada.

Example

Este exemplo demonstra a abordagem da secção crítica aninhada controlando o acesso a um recurso partilhado (o objeto estático _strShared ) usando um objeto partilhado CCriticalSection . A SomeMethod função demonstra a atualização de um recurso partilhado de forma 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 secção crítico que é usado por todos os CCriticalSection métodos.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Recupera um CRITICAL_SECTION objeto.

operator CRITICAL_SECTION*();

Observações

Chame esta função para recuperar um ponteiro para o objeto interno CRITICAL_SECTION .

CCriticalSection::Unlock

Liberta o CCriticalSection objeto para uso por outro tópico.

BOOL Unlock();

Valor de retorno

Diferente de zero se o CCriticalSection objeto pertencesse à thread e a libertação foi bem-sucedida; caso contrário, 0.

Observações

Se o CCriticalSection estiver a ser usado de forma autónoma, Unlock deve ser chamado imediatamente após concluir a utilização do recurso controlado pela secção crítica. Se um CSingleLock objeto estiver a ser usado, CCriticalSection::Unlock será chamado pela função membro do Unlock objeto de bloqueio.

Example

Veja o exemplo para CCriticalSection::Lock.

Consulte também

CSyncObject Classe
Gráfico de Hierarquia
CMutex Classe