Partilhar via


Multithreading: Quando usar classes de sincronização MFC

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

As classes de sincronização são usadas quando o acesso a um recurso deve ser controlado para garantir a integridade do recurso. As classes de acesso de sincronização são usadas para obter acesso a esses recursos controlados. Este tópico descreve quando usar cada classe.

Para determinar qual classe de sincronização você deve usar, faça a seguinte série de perguntas:

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

    Em caso afirmativo, utilizar CEvent.

  2. Mais de um thread dentro do mesmo aplicativo pode acessar esse recurso ao mesmo tempo (por exemplo, seu aplicativo permite até cinco janelas com exibições no mesmo documento)?

    Em caso afirmativo, utilizar CSemaphore.

  3. Mais de um aplicativo pode usar esse recurso (por exemplo, o recurso está em uma DLL)?

    Em caso afirmativo, utilizar CMutex.

    Em caso negativo, utilize 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

Como exemplo, pegue um aplicativo que mantém uma lista vinculada de contas. Esta aplicação permite que até três contas sejam examinadas em janelas separadas, mas apenas uma pode ser atualizada a qualquer momento. Quando uma conta é atualizada, os dados atualizados são enviados pela rede para um arquivo de dados.

Este aplicativo de exemplo usa todos os três tipos de classes de sincronização. Como ele permite que até três contas sejam examinadas ao mesmo tempo, ele usa CSemaphore para limitar o acesso a três objetos de exibição. Quando ocorre uma tentativa de exibir uma quarta conta, o aplicativo aguarda até que uma das três primeiras janelas seja fechada ou falha. Quando uma conta é atualizada, o aplicativo usa CCriticalSection para garantir que apenas uma conta seja atualizada de cada vez. Depois que a atualização for bem-sucedida, ele sinaliza CEvent, o que libera um thread aguardando que o evento seja sinalizado. Este thread envia os novos dados para o arquivo de dados.

Exemplo 2: Usando classes de acesso de sincronização

Escolher qual classe de acesso de sincronização usar é ainda mais simples. Se o seu aplicativo estiver preocupado em acessar apenas um único recurso controlado, use CSingleLock. Se precisar de acesso a qualquer um dos vários recursos controlados, use CMultiLock. No exemplo 1, CSingleLock teria sido usado, porque em cada caso apenas um recurso é necessário em um determinado momento.

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 sincronização, consulte Sincronização no SDK do Windows. Para obter informações sobre o suporte a multithreading no MFC, consulte Multithreading com C++ e MFC.

Ver também

Multithreading com C++ e MFC