Multithreading: Dicas de Programação
Aplicativos multithread exigem cuidado mais rígido que aplicativos de thread único ao acessar os dados.Como existem várias, caminhos independentes de execução em usar simultaneamente em aplicativos multissegmentados, os algoritmos, os dados ou ambos devem estar cientes que os dados poderia ser usado por mais de um thread por vez.Este tópico explica as técnicas para evitar possíveis problemas ao programar aplicativos multissegmentados com a biblioteca Microsoft Foundation classe (MFC).
Acessando objetos de vários segmentos
Acessando objetos MFC de threads não MFC
Mapas de identificador do Windows
Comunicação entre threads
Acessando objetos de vários segmentos
Por motivos de desempenho e dimensionar, MFC objetos não são thread-safe no nível do objeto, somente no nível de classe.Isso significa que você pode ter dois processos separados manipular dois diferentes CString objetos, mas não dois threads, manipular os mesmos CString objeto. Se você absolutamente deve ter vários segmentos manipular o mesmo objeto, proteger tal acesso com mecanismos de sincronização Win32 apropriados, sistema autônomo seções críticas.Para obter mais informações sobre as seções críticas e outros objetos relacionados, consulte Sincronização in the Windows SDK.
O classe biblioteca usa seções críticas internamente para proteger sistema autônomo estruturas de dados global, sistema autônomo aqueles usados pela alocação de memória de depurar.
Acessando objetos MFC de threads não MFC
Se você tiver um aplicativo multithread que cria um segmento de maneira diferente usando um CWinThread o objeto, não é possível acesso outros objetos MFC partir desse thread.Em outras palavras, se você quiser acesso qualquer objeto MFC a partir de um thread secundário, você deve criar esse thread com um dos métodos descritos em Multithreading: Criando a interface do usuário encadeamentos 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 multissegmentados.
Mapas de identificador do Windows
sistema autônomo regra geral, um thread pode acesso somente MFC objetos que ele criou.Isso ocorre porque os mapas de identificador Windows temporários e permanentes são mantidos no armazenamento local de thread para ajudar a manter a proteção contra acesso simultâneo de vários threads.Por exemplo, um thread de trabalho não é possível executar um cálculo e, em seguida, chame UpdateAllViews função de membro para que as janelas que contêm modos de exibição de novos dados modificados. Isso tem efeito algum, pois o MAP de CWnd objetos de HWNDs é o local principal thread. Isso significa que um thread pode ter um mapeamento de uma alça com 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 thread não devem ser refletidas no Outros.
Há várias maneiras de solucionar esse problema.A primeira é passar identificadores individuais (por exemplo, um HWND) em vez de objetos C++ para thread de trabalho. O thread de trabalho adiciona esses objetos ao MAP temporário chamando o apropriado FromHandle função de membro. Você também pode adicionar o objeto ao MAP permanente do thread chamando Anexar, mas isso deve ser feita somente se você têm a garantia de que o objeto existirá mais que o thread.
Outro método é criar novas mensagens definidas pelo usuário correspondente a diferentes tarefas seu trabalho segmentos será realização e postar essas mensagens à janela principal do aplicativo usando :: PostMessage.Esse método de comunicação é semelhante a dois aplicativos diferentes conversar, exceto pelo fato de que ambos os threads estão em execução no mesmo espaço de endereço.
Para obter mais informações sobre mapas de alça, consulte Observação técnica 3.Para obter mais informações sobre o armazenamento local de thread, consulte Armazenamento local de thread and Usando o armazenamento local de thread in the Windows SDK.
Comunicação entre threads
MFC oferece uma série de classes que permitem que os segmentos para sincronizar o acesso a objetos para manter a acesso thread-safe.Uso dessas classes é descrito em Multithreading: Como usar a sincronização classes e Multithreading: Quando usar a sincronização classes.Para obter mais informações sobre esses objetos, consulte Sincronização in the Windows SDK.