Subprocesamiento múltiple: Sugerencias de programación

Actualización: noviembre 2007

Las aplicaciones multiproceso requieren un control más estricto que las aplicaciones de un único proceso para el acceso a los datos. Puesto que las aplicaciones multiproceso presentan simultáneamente varios hilos de ejecución independientes, tanto los algoritmos como los datos deben tener en cuenta que los datos pueden ser utilizados por varios procesos al mismo tiempo. 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 múltiples subprocesos

  • Acceso a objetos MFC desde subprocesos no MFC

  • Asignaciones de identificadores de Windows

  • Comunicación entre subprocesos

Acceso a objetos desde múltiples subprocesos

Por motivos de tamaño y rendimiento, los objetos MFC no ofrecen seguridad para subprocesos en el ámbito de los objetos sino sólo en el ámbito de las clases. Esto significa que pueden existir dos subprocesos independientes que manipulen diferentes objetos CString, pero no el mismo objeto CString. Si es absolutamente necesario disponer de múltiples subprocesos para manipular el mismo objeto, se debe proteger el acceso mediante mecanismos de sincronización de Win32 apropiados como, por ejemplo, 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 no MFC

En una aplicación multiproceso que crea un subproceso sin utilizar un objeto CWinThread, no es posible tener acceso a otros objetos MFC desde ese subproceso. Es decir, si desea tener acceso a cualquier objeto MFC desde un subproceso secundario, debe crear ese subproceso con uno de los métodos descritos en Subprocesamiento múltiple: Crear subprocesos de la interfaz de usuario o Subprocesamiento múltiple: 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.

Asignaciones de identificadores de Windows

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 identificadores 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 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 sólo 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 asignación de identificadores, vea la Nota técnica 3. Para obtener más información sobre el almacenamiento local de subprocesos, vea Almacenamiento local de subprocesos (TLS) y Utilizar almacenamiento local de subprocesos 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 Subprocesamiento múltiple: Uso de las clases de sincronización y Subprocesamiento múltiple: Cuándo utilizar las clases de sincronización. Para obtener más información sobre estos objetos, vea Sincronización en Windows SDK.

Vea también

Conceptos

Subprocesamiento múltiple con C++ y MFC