Clase CCriticalSection

Representa una "sección crítica", que es un objeto de sincronización que permite que solo un subproceso cada vez tenga acceso a un recurso o sección de código.

Sintaxis

class CCriticalSection : public CSyncObject

Miembros

Constructores públicos

Nombre Descripción
CCriticalSection::CCriticalSection Construye un objeto CCriticalSection.

Métodos públicos

Nombre Descripción
CCriticalSection::Lock Se usa para acceder al objeto CCriticalSection.
CCriticalSection::Unlock Libera el objeto CCriticalSection.

Operadores públicos

Nombre Descripción
CCriticalSection::operator CRITICAL_SECTION* Recupera un puntero al objeto interno CRITICAL_SECTION.

Miembros de datos públicos

Nombre Descripción
CCriticalSection::m_sect Un objeto CRITICAL_SECTION.

Comentarios

Las secciones críticas 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 CCriticalSection objeto para controlar la lista vinculada, solo un subproceso a la vez puede obtener acceso a la lista.

Nota:

La funcionalidad de la clase CCriticalSection la proporciona un objeto CRITICAL_SECTION de Win32 real.

Las secciones críticas se usan en lugar de las exclusiones mutuas (consulte CMutex) cuando la velocidad es crítica y el recurso no se va a usar entre límites de proceso.

Hay dos métodos para usar un objeto CCriticalSection: independiente e insertado en una clase.

  • Método independiente: para usar un objeto CCriticalSection independiente, construya el objeto CCriticalSection cuando sea necesario. Después de una devolución correcta del constructor, bloquee explícitamente el objeto con una llamada a Lock. Llame a Unlock cuando haya terminado de acceder a la sección crítica. Este método, aunque es más claro para alguien que lea el código fuente que el usuario ha escrito, es más propenso a errores, ya que debe recordar bloquear y desbloquear la sección crítica antes y después del acceso.

    Un método más preferible es usar la clase CSingleLock. También tiene un método Lock y Unlock, pero no tiene que preocuparse por desbloquear el recurso si se produce una excepción.

  • Método insertado: también puede compartir una clase con varios subprocesos agregando un miembro de datos del tipo CCriticalSection a la clase y bloqueando el miembro de datos cuando sea necesario.

Para obtener más información sobre el uso CCriticalSection de objetos, consulte el artículo Multithreading: Cómo usar las clases de sincronización.

Jerarquía de herencia

CObject

CSyncObject

CCriticalSection

Requisitos

Encabezado: afxmt.h

CCriticalSection::CCriticalSection

Construye un objeto CCriticalSection.

CCriticalSection();

Comentarios

Para acceder a un objeto CCriticalSection o liberarlo, cree un objeto CSingleLock y llame a sus funciones miembro Lock y Unlock. Si el CCriticalSection objeto se usa de forma independiente, llame a su Unlock función miembro para liberarlo.

Si el constructor no puede asignar la memoria del sistema necesaria, se genera automáticamente una excepción de memoria (del tipo CMemoryException).

Ejemplo

Consulte el ejemplo de CCriticalSection::Lock.

CCriticalSection::Lock

Llame a esta función miembro para acceder al objeto de sección crítica.

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

Parámetros

dwTimeoutLock omite este valor de parámetro.

Valor devuelto

Distinto de cero si la función se realizó correctamente; de lo contrario, 0.

Comentarios

Lock es una llamada de bloqueo que no devolverá hasta que se señale el objeto de sección crítica (está disponible).

Si se necesitan esperas con tiempo, puede usar un objeto CMutex en lugar de un objeto CCriticalSection.

Si CMemoryException no puede asignar la memoria del sistema necesaria, se genera automáticamente una excepción de memoria (del tipo Lock).

Ejemplo

En este ejemplo se muestra el enfoque de sección crítica anidada controlando el acceso a un recurso compartido (el objeto _strShared estático) mediante un objeto CCriticalSection compartido. La función SomeMethod muestra cómo actualizar un recurso compartido de forma segura.

//Definition of critical section class
class CMyCritSectClass
{
   static CString _strShared; //shared resource
   static CCriticalSection _critSect;

public:
   CMyCritSectClass(void) {}
   ~CMyCritSectClass(void) {}
   void SomeMethod(void); //locks, modifies, and unlocks shared resource
};

//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()
{
   _critSect.Lock();
   if (_strShared == "")
      _strShared = "<text>";
   _critSect.Unlock();
}

CCriticalSection::m_sect

Contiene un objeto de sección crítica que usan todos los métodos CCriticalSection.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Recupera un objeto CRITICAL_SECTION.

operator CRITICAL_SECTION*();

Comentarios

Llame a esta función para recuperar un puntero al objeto CRITICAL_SECTION interno.

CCriticalSection::Unlock

Libera el objeto CCriticalSection para que lo use otro subproceso.

BOOL Unlock();

Valor devuelto

Distinto de cero si el objeto CCriticalSection era propiedad del subproceso y la liberación se realizó correctamente; en caso contrario, 0.

Comentarios

Si se usa CCriticalSection de forma independiente, se debe llamar a Unlock inmediatamente después de completar el uso del recurso controlado por la sección crítica. Si se usa un objeto CSingleLock, la función miembro Unlock del objeto de bloqueo llamará a CCriticalSection::Unlock.

Ejemplo

Vea el ejemplo de CCriticalSection::Lock.

Consulte también

CSyncObject (clase)
Gráfico de jerarquías
CMutex (clase)