Share via


Multithreading: sugerencias de programación de MFC

Las aplicaciones multiproceso requieren un cuidado más estricto que las aplicaciones de un solo subproceso para garantizar que las operaciones se producen en el orden previsto y los datos a los que acceden varios subprocesos no están dañados. Este tema describe técnicas para evitar posibles problemas cuando se programan aplicaciones multiproceso con la biblioteca de MFC (Microsoft Foundation Class).

Acceso a objetos desde varios subprocesos

Los objetos MFC no son seguros para subprocesos por sí mismos. Dos subprocesos independientes no pueden manipular el mismo objeto a menos que use las clases de sincronización de MFC o los objetos de sincronización de Win32 adecuados, tales como secciones críticas. Para obtener más información acerca de las secciones críticas y otros objetos relacionados, vea Sincronización en Windows SDK.

La biblioteca de clases utiliza internamente secciones críticas para proteger las estructuras de datos globales, como son las utilizadas por la asignación de memoria para depuración.

Acceso a objetos MFC desde subprocesos que no son MFC

En una aplicación multiproceso que crea un subproceso sin utilizar un objeto CWinThread, no es posible acceder a otros objetos MFC desde ese subproceso. Es decir, si quiere tener acceso a cualquier objeto MFC desde un subproceso secundario, debe crear ese subproceso con uno de los métodos descritos en Multithreading: Crear subprocesos de la interfaz de usuario o Multithreading: Crear subprocesos de trabajo. Estos métodos son los únicos que permiten a la biblioteca de clases inicializar las variables internas necesarias para controlar aplicaciones multiproceso.

Identificador de Windows Mapas

Por regla general, un subproceso sólo puede tener acceso a los objetos MFC que haya creado. Esto se debe a que las asignaciones de identificadores temporales y permanentes de Windows se conservan en almacenamiento local de subprocesos para ayudar a mantener la protección frente a accesos simultáneos desde múltiples subprocesos. Por ejemplo, un subproceso de trabajo no puede realizar un cálculo y entonces llama a la función miembro UpdateAllViews de un documento para modificar las ventanas que contienen vistas de los nuevos datos. Esto no tiene ningún efecto, ya que la asignación de objetos CWnd a HWND es local en relación con el subproceso primario. Es decir, un subproceso podría tener una asignación de un identificador de Windows a un objeto de C++, pero otro subproceso podría asignar el mismo identificador a un objeto diferente de C++. Los cambios realizados en un subproceso no se reflejarían en el otro.

Existen varias soluciones para este problema. La primera consiste en pasar identificadores individuales (tales como un elemento HWND), en vez de objetos de C++, al subproceso de trabajo. El subproceso de trabajo agrega entonces estos objetos a su asignación temporal mediante una llamada a la función miembro FromHandle apropiada. También se podría agregar el objeto a la asignación permanente mediante una llamada a Attach, pero esto solo se debería hacer si se tiene la garantía de que el objeto sigue existiendo después de terminar el subproceso.

Otro método consiste en crear mensajes definidos por el usuario correspondientes a las diferentes tareas que el subproceso de trabajo vaya a realizar, y enviar estos mensajes a la ventana principal de la aplicación mediante ::PostMessage. Este método de comunicación es similar a dos aplicaciones diferentes que conversan, excepto que ambos subprocesos se ejecutan en el mismo espacio de direcciones.

Para obtener más información sobre la asignación de identificadores, vea la Nota técnica 3. A fin de obtener más información sobre el almacenamiento local para el subproceso, vea Almacenamiento local para el subproceso y Uso del almacenamiento local para el subproceso en Windows SDK.

Comunicación entre subprocesos

MFC proporciona una serie de clases que permiten sincronizar el acceso a los objetos para garantizar subprocesos correctos. La utilización de estas clases se describe en Multithreading: Uso de las clases de sincronización y Multithreading: Cuándo utilizar las clases de sincronización. Para obtener más información sobre estos objetos, vea Sincronización en Windows SDK.

Consulte también

Multithreading con C++ y MFC