Multithreading: Quando usar as Classes de sincronização

As classes multithread fornecidas com o MFC se encaixam em duas categorias: objetos de sincronização (CSyncObject, CSemaphore, CMutex, CCriticalSection, e CEvent) e objetos de acesso de sincronização (CMultiLock e CSingleLock).

Classes de sincronização são usadas quando o acesso a um recurso deve ser controlado para garantir a 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:

  1. O aplicativo tem esperar que algo aconteça antes que ele pode acessar o recurso (por exemplo, dados devem ser recebidos de uma porta de comunicação antes que ele pode ser gravado em um arquivo)?

    Se Sim, use CEvent.

  2. Pode mais de um thread dentro do mesmo acesso do aplicativo Este recurso ao mesmo tempo (por exemplo, se seu aplicativo permite que até cinco windows com modos de exibição no mesmo documento)?

    Se Sim, use CSemaphore.

  3. Pode mais de um aplicativo usar este recurso (por exemplo, o recurso está em uma DLL)?

    Se Sim, use CMutex.

    Se não, use CCriticalSection.

CSyncObject nunca é usado diretamente. É a classe base para as outras quatro classes de sincronização.

Exemplo 1: Usando três Classes de sincronização

Por exemplo, levar a um aplicativo que mantém uma lista de contas. Esse aplicativo permite que até três contas de ser examinado em janelas separadas, mas somente um pode ser atualizado a qualquer momento específico. Quando uma conta for atualizada, os dados atualizados são enviados pela rede para um arquivamento de dados.

O aplicativo de exemplo usa os três tipos de classes de sincronização. Porque ela permite que até três contas a ser examinado, ao mesmo tempo, ele usa CSemaphore para limitar o acesso a três objetos de exibição. Quando uma tentativa de exibir uma quarta conta ocorre, o aplicativo ou aguarda um fecha o três primeiras windows ou ele falha. Quando uma conta for atualizada, o aplicativo usa CCriticalSection para garantir que apenas uma conta seja atualizada no momento. Após a atualização for bem-sucedida, ele sinaliza CEvent, que lança um thread aguardando o evento deve ser sinalizado. Esse thread envia os dados de novos para o arquivamento 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, apenas um recurso é necessária em qualquer tempo determinado.

Para obter informações sobre como as classes de sincronização são usadas, consulte Multithreading: Como usar as Classes de sincronização. Para obter informações sobre a sincronização, consulte sincronização na Windows SDK. Para obter informações sobre o suporte a multithreading no MFC, consulte Multithreading com C++ e MFC.

Consulte também

Conceitos

Multithreading com C++ e MFC