Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 oCCriticalSectionobjeto quando for necessário. Após um retorno bem-sucedido do construtor, bloqueie explicitamente o objeto com uma chamada paraLock. LigaUnlockquando 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
CSingleLockaula. Também tem umLockmétodo ANDUnlock, 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
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.