Share via


Multithreading: quando usar as classes de sincronização do MFC

As classes com multithread fornecidas com o 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 precisa 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 a classe de sincronização que você deve usar, faça a seguinte série de perguntas:

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

    Se sim, use 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 do mesmo documento)?

    Se sim, use CSemaphore.

  3. 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 é usada diretamente. Ela é a classe base para as outras quatro classes de sincronização.

Exemplo 1: usando três classes de sincronização

Como exemplo, use um aplicativo que mantém uma lista vinculada de contas. Esse aplicativo permite examinar até três contas em janelas separadas, mas apenas uma pode ser atualizada a qualquer momento específico. Quando uma conta é atualizada, os dados atualizados são enviados pela rede para um arquivo morto 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 o 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 por vez. Depois que a atualização for bem-sucedida, ela sinalizará CEvent, que libera um thread aguardando a sinalização do evento. Esse thread envia os novos dados para o arquivo morto de dados.

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

Escolher qual classe de acesso de sincronização usar é ainda mais simples. Se a preocupação for que o aplicativo acesse 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, pois em cada caso apenas um recurso é necessário em qualquer momento específico.

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

Confira também

Multithreading com C++ e MFC