Compartir a través de


Multithreading: Cuándo usar las clases de sincronización de MFC

Las clases multiproceso proporcionadas con MFC se dividen en dos categorías: objetos de sincronización (CSyncObject, CSemaphore, CMutex, CCriticalSection y CEvent) y objetos de acceso de sincronización (CMultiLock y CSingleLock).

Las clases de sincronización se usan cuando se debe controlar el acceso a un recurso para garantizar la integridad del mismo. Las clases de acceso de sincronización se usan para acceder a estos recursos controlados. En este tema se describe cuándo usar cada clase.

Para determinar qué clase de sincronización debe usar, formule las siguientes preguntas:

  1. ¿Tiene que esperar la aplicación a que ocurra algo antes de que pueda acceder al recurso (por ejemplo, los datos deben recibirse desde un puerto de comunicaciones antes de que se pueda escribir en un archivo)?

    Si es así, use CEvent.

  2. ¿Puede más de un subproceso dentro de la misma aplicación acceder a este recurso a la vez (por ejemplo, la aplicación permite hasta cinco ventanas con vistas en el mismo documento)?

    Si es así, use CSemaphore.

  3. ¿Puede más de una aplicación usar este recurso (por ejemplo, el recurso está en un archivo DLL)?

    Si es así, use CMutex.

    En caso contrario, use CCriticalSection.

CSyncObject nunca se usa directamente. Es la clase base para las otras cuatro clases de sincronización.

Ejemplo 1: Usar tres clases de sincronización

Como ejemplo, considere una aplicación que mantiene una lista vinculada de cuentas. Esta aplicación permite examinar hasta tres cuentas en ventanas independientes, pero sólo se puede actualizar una en un momento dado. Cuando se actualiza una cuenta, los datos actualizados se envían a un archivo recopilatorio de datos.

Esta aplicación de ejemplo utiliza los tres tipos de clases de sincronización. Ya que se pueden examinar hasta tres cuentas a la vez, se utiliza CSemaphore para limitar el acceso a tres objetos de tipo vista. Cuando se produce un intento de ver una cuarta cuenta, la aplicación espera a que se cierre una de las tres primeras ventanas o bien genera un error. En el momento de actualizar una cuenta, la aplicación utiliza CCriticalSection para garantizar que solo se actualiza una cuenta cada vez. Si la actualización termina correctamente, la aplicación señaliza el evento CEvent, lo cual permite liberar un subproceso que se encontraba en espera de la señalización del evento. Este subproceso envía los nuevos datos al archivo de almacenamiento de datos.

Ejemplo 2: Uso de clases de acceso de sincronización

Elegir qué clase de acceso de sincronización usar es incluso más sencillo. Si la aplicación solo tiene que acceder a un único recurso controlado, use CSingleLock. Si necesita acceso a un recurso controlado de entre varios, use CMultiLock. En el ejemplo 1, se habría usado CSingleLock porque en cada caso solo se necesita un recurso en un momento determinado.

Para obtener información sobre cómo se usan las clases de sincronización, consulte Multithreading: Uso de las clases de sincronización. Para más información sobre la sincronización, consulte Sincronización en Windows SDK. Para más información sobre la compatibilidad con el multithreading en MFC, consulte Multithreading con C++ y MFC.

Consulte también

Multithreading con C++ y MFC