Clase CMutex
Representa una “exclusión mutua”, que es un objeto de sincronización que permite que un subproceso tenga acceso de manera exclusiva mutua a un recurso.
Sintaxis
class CMutex : public CSyncObject
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
CMutex::CMutex | Construye un objeto CMutex . |
Comentarios
Las exclusiones mutuas son útiles cuando solo se puede permitir que un subproceso a la vez modifique los datos o algún otro recurso controlado. Por ejemplo, agregar nodos a una lista vinculada es un proceso que solo debe permitir un subproceso a la vez. Mediante el uso de un CMutex
objeto para controlar la lista vinculada, solo un subproceso a la vez puede obtener acceso a la lista.
Para usar un objeto CMutex
, construya el objeto CMutex
cuando sea necesario. Especifique el nombre de la exclusión mutua en la que desea esperar y que su aplicación debe poseer inicialmente. A continuación, puede acceder a la exclusión mutua cuando el constructor vuelva. Llamada a CSyncObject::Unlock cuando haya terminado de acceder al recurso controlado.
Un método alternativo para usar objetos CMutex
es agregar una variable de tipo CMutex
como miembro de datos a la clase que desea controlar. Durante la construcción del objeto controlado, haga una llamada al constructor del miembro de CMutex
datos especificando si la exclusión mutua es propiedad inicialmente, el nombre de la exclusión mutua (si se usará en los límites del proceso) y los atributos de seguridad deseados.
Para acceder a los recursos controlados por CMutex
objetos de esta manera, primero cree una variable de tipo CSingleLock o escriba CMultiLock en la función miembro de acceso del recurso. A continuación, llame a la función miembro del Lock
objeto de bloqueo (por ejemplo, CSingleLock::Lock). En este momento, el subproceso obtendrá acceso al recurso, esperará a que el recurso se libere y obtenga acceso, o esperará a que se libere el recurso y se agote el tiempo de espera, sin obtener acceso al recurso. En cualquier caso, se ha accedido al recurso de forma segura para subproceso. Para liberar el recurso, use la función miembro del Unlock
objeto de bloqueo (por ejemplo, CSingleLock::Unlock), o permita que el objeto de bloqueo quede fuera del ámbito.
Para obtener más información sobre el uso CMutex
de objetos, consulte el artículo Multithreading: Cómo usar las clases de sincronización.
Jerarquía de herencia
CMutex
Requisitos
Encabezado: afxmt.h
CMutex::CMutex
Construye un objeto CMutex
con o sin nombre.
CMutex(
BOOL bInitiallyOwn = FALSE,
LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);
Parámetros
bInitiallyOwn
Especifica si el subproceso que crea el CMutex
objeto inicialmente tiene acceso al recurso controlado por la exclusión mutua.
lpszName
Nombre del objeto CMutex
. Si existe otra exclusión mutua con el mismo nombre, se debe proporcionar lpszName si el objeto se usará a través de los límites del proceso. Si es NULL, la exclusión mutua no tendrá nombre. Si el nombre coincide con una exclusión mutua existente, el constructor crea un nuevo CMutex
objeto que hace referencia a la exclusión mutua de ese nombre. Si el nombre coincide con un objeto de sincronización existente que no es una exclusión mutua, se producirá un error en la construcción.
lpsaAttribute
Atributos de seguridad para el objeto de exclusión mutua. Para obtener una descripción completa de esta estructura, vea SECURITY_ATTRIBUTES en Windows SDK.
Comentarios
Para acceder o liberar un CMutex
objeto, cree un objeto CMultiLock o CSingleLock y llame a sus funciones de miembro Bloquear y Desbloquear. Si el CMutex
objeto se usa de forma independiente, llame a su Unlock
función miembro para liberarlo.
Importante
Después de crear el CMutex
objeto, use GetLastError para asegurarse de que la exclusión mutua aún no existía. Si la exclusión mutua existía inesperadamente, puede indicar que un proceso no autorizado está en ocupación y puede estar intentando usar la exclusión mutua de forma malintencionada. En este caso, el procedimiento recomendado para la seguridad es cerrar el identificador y continuar como si hubiera un error al crear el objeto.