Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Clase
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
CCriticalSectionindependiente, construya el objetoCCriticalSectioncuando sea necesario. Después de una devolución correcta del constructor, bloquee explícitamente el objeto con una llamada aLock. Llame aUnlockcuando 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étodoLockyUnlock, 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
CCriticalSectiona 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
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.