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 objetoCCriticalSection
cuando sea necesario. Después de una devolución correcta del constructor, bloquee explícitamente el objeto con una llamada aLock
. Llame aUnlock
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étodoLock
yUnlock
, 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
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
dwTimeout
Lock
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
.