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