Multithreading: Quando usar as classes de sincronização
As classes multithread fornecidas com o MFC se enquadram em duas categorias: objetos de sincronização (CSyncObject, CSemaphore, CMutex, CCriticalSection, and CEvent) e objetos de acesso de sincronização (CMultiLock and CSingleLock).
Classes de sincronização são usadas quando o acesso a um recurso deve ser controlado para garantir integridade do recurso.Classes de acesso de sincronização são usados para acessar esses recursos controlados.Este tópico descreve quando usar cada classe.
Para determinar qual classe de sincronização, você deve usar, pergunte a série de perguntas a seguir:
Faz o aplicativo precisam aguardar até que algo aconteça antes que possa acesso o recurso (por exemplo, dados devem ser recebidos de uma porta de comunicação antes de ela ser gravada em um arquivo)?
Se Sim, use CEvent.
Pode mais de um thread dentro do mesmo acesso do aplicativo Este recurso ao mesmo time (por exemplo, o aplicativo permite até cinco janelas com modos de exibição no mesmo documento)?
Se Sim, use CSemaphore.
Mais de um aplicativo pode usar esse recurso (por exemplo, o recurso está em uma DLL)?
Se Sim, use CMutex.
Se não, use CCriticalSection.
CSyncObject nunca é usado diretamente.Ele é a classe base para o Outros quatro classes de sincronização.
Exemplo 1: Usando três classes de sincronização
sistema autônomo Por exemplo, colocar um aplicativo que mantém uma lista vinculada de contas.Este aplicativo permite que até três contas a ser examinado em janelas separadas, mas somente um pode ser atualizado no qualquer determinado time.Quando uma conta for atualizada, os dados atualizados são enviados pela rede para um arquivar de dados.
Este aplicativo exemplo usa os três tipos de classes de sincronização.Porque ela permite que até três contas a ser examinado ao mesmo time, ele usa CSemaphore para limitar o acesso aos três objetos de exibição. Quando uma tentativa de ler de uma quarta conta ocorre, o aplicativo seja aguarda até que um dos fecha primeiro três janelas ou ele falhar.Quando uma conta for atualizada, o aplicativo usa CCriticalSection para garantir que apenas uma conta seja atualizada ao mesmo time. Após a atualização for bem-sucedida, ele sinaliza CEvent, que lança um thread aguardando o evento ser sinalizado. Esse thread envia os dados novos para o arquivar de dados.
Exemplo 2: Usando classes de acesso de sincronização
Escolher qual classe de acesso de sincronização para usar é ainda mais simples.Se seu aplicativo está preocupado com a acessar apenas um único recurso controlado, use CSingleLock. Se ele precisa acessar qualquer um dos vários recursos controlados, use CMultiLock. No exemplo 1, CSingleLock seria usado, porque em cada caso é necessário apenas um recurso em um determinado momento.
Para obter informações sobre como as classes de sincronização são usadas, consulte Multithreading: Como usar a sincronização classes.Para obter informações sobre a sincronização, consulte Sincronização in the Windows SDK. Para obter informações sobre o suporte a multithreading no MFC, consulte Multithreading com C++ e do MFC.