Multithreading: Dicas de Programação
Aplicativos multithread exigem cuidado mais rígido que aplicativos single-threaded ao acessar os dados. Como existem várias, caminhos independentes de execução em usam simultaneamente em aplicativos multithread, os algoritmos, os dados ou ambos devem estar cientes que os dados podem ser usadas por mais de um segmento por vez. Este tópico explica as técnicas para evitar possíveis problemas ao programar aplicativos multithread com a biblioteca Microsoft Foundation Class (MFC).
Acesso a objetos de vários Threads
Acesso a objetos do MFC de Threads de não-MFC
Mapas de identificador do Windows
Comunicação entre segmentos
Acesso a objetos de vários Threads
Por motivos de desempenho e tamanho, objetos MFC não são thread-safe no nível do objeto, somente no nível de classe. Isso significa que você pode ter dois threads separados, manipulação de duas diferentes CString objetos, mas não dois threads, manipulando o mesmo CString objeto. Se absolutamente, você deve ter o mesmo objeto de manipulação de vários segmentos, protege tal acesso com mecanismos de sincronização Win32 apropriados, como, por exemplo, as seções críticas. Para obter mais informações sobre as seções críticas e outros objetos de relacionados, consulte sincronização na Windows SDK.
A biblioteca de classes usa seções críticas internamente para proteger as estruturas de dados globais, como aqueles usados pela alocação de memória de depuração.
Acesso a objetos do MFC de Threads de não-MFC
Se você tiver um aplicativo multithread, cria um thread de maneira diferente usando um CWinThread o objeto, você não pode acessar outros objetos do MFC a partir do thread. Em outras palavras, se você deseja acessar qualquer objeto do MFC a partir de um thread secundário, você deve criar esse thread com um dos métodos descritos no Multithreading: A criação de Threads de Interface de usuário ou Multithreading: Criando segmentos de trabalho. Esses métodos são os únicos que permitem que a biblioteca de classes inicializar as variáveis internas necessárias para lidar com aplicativos multithread.
Mapas de identificador do Windows
Como regra geral, um thread pode acessar somente os objetos MFC que ele criou. Isso ocorre porque os mapas de alça Windows temporários e permanentes são mantidos no armazenamento local de segmento para ajudar a manter a proteção contra o acesso simultâneo de vários threads. Por exemplo, um segmento de trabalho não é possível executar um cálculo e, em seguida, chamar um documento UpdateAllViews a função de membro para que as janelas que contêm exibições de novos dados modificados. Isso não tem efeito algum, porque o mapa de CWnd objetos HWNDs é o local para o thread principal. Isso significa que um segmento pode ter um mapeamento de um identificador do Windows para um objeto C++, mas outro thread pode mapear esse mesmo identificador para um objeto diferente do C++. As alterações feitas em um segmento não se refletiria no outro.
Há várias maneiras de solucionar esse problema. A primeira é passar identificadores individuais (como um HWND) em vez de objetos em C++ para o thread de trabalho. O segmento de trabalho adiciona esses objetos ao seu mapa temporário chamando o apropriado FromHandle função de membro. Você também pode adicionar o objeto ao mapa de permanente do segmento chamando Attach, mas isso deve ser feito somente se há garantia de que o objeto existirá mais do que o thread.
Outro método é criar novas mensagens definidas pelo usuário correspondente às tarefas diferentes a segmentos de trabalho será realização e postar essas mensagens para a janela principal do aplicativo usando :: PostMessage. Esse método de comunicação é semelhante a dois aplicativos diferentes para conversar com exceção de que ambos os segmentos estão em execução no mesmo espaço de endereço.
Para obter mais informações sobre mapas de alça, consulte técnico nota 3. Para obter mais informações sobre o armazenamento local de segmento, consulte Armazenamento Local de segmento e Usando o armazenamento Local de segmento na Windows SDK.
Comunicação entre segmentos
MFC fornece um número de classes que permitem que os threads sincronizar o acesso a objetos para manter a segurança do thread. O uso dessas classes é descrito na Multithreading: Como usar as Classes de sincronização e Multithreading: Quando usar as Classes de sincronização. Para obter mais informações sobre esses objetos, consulte sincronização na Windows SDK.