Share via


Estructuras de datos de sincronización

El Runtime de simultaneidad proporciona varias estructuras de datos que permiten sincronizar el acceso a los datos compartidos de varios subprocesos.Estas estructuras de datos son útiles en el caso de disponer de datos compartidos que apenas se modifican.Un objeto de sincronización, como una sección crítica, hace que otros subprocesos esperen hasta que esté disponible el recurso compartido.Por consiguiente, si se utiliza este tipo de objeto para sincronizar el acceso a datos de uso frecuente, es posible que la aplicación pierda escalabilidad.El Parallel Patterns Library (PPL) proporciona el concurrency::combinable (clase), lo que permite compartir un recurso entre varios subprocesos o las tareas sin la necesidad de sincronización.Para obtener más información sobre la clase combinable, vea Contenedores y objetos paralelos.

Secciones

En este tema, se describen detalladamente los siguientes tipos de bloques de mensajes asincrónicos:

  • critical_section

  • reader_writer_lock

  • scoped_lock y scoped_lock_read

  • event

critical_section

El concurrency::critical_section clase representa un objeto de exclusión mutua cooperación cede a otras tareas en lugar de preferencia sobre ellos.Las secciones críticas son útiles cuando varios subprocesos requieren acceso exclusivo de lectura y escritura a los datos compartidos.

La clase critical_section es no reentrante.El concurrency::critical_section::lock método produce una excepción de tipo concurrency::improper_lock si se llama por el subproceso que ya posee el bloqueo.

Dd492638.collapse_all(es-es,VS.110).gifMétodos y características

En la tabla siguiente se muestran los métodos importantes definidos por la clase critical_section.

Método

Descripción

bloquear

Adquiere la sección crítica.El contexto de la llamada se bloquea hasta que adquiere el bloqueo.

try_lock

Intenta adquirir la sección crítica, pero no se bloquea.

unlock

Libera la sección crítica.

Top

reader_writer_lock

El concurrency::reader_writer_lock clase proporciona las operaciones de seguro para subprocesos de lectura y escritura a los datos compartidos.Utilice bloqueos de lectura o escritura cuando varios subprocesos requieren acceso de lectura simultáneo a un recurso compartido pero apenas escriben en dicho recurso.Esta clase solo proporciona acceso de escritura a un objeto a la vez.

La clase reader_writer_lock tiene mejor rendimiento que la clase critical_section porque un objeto critical_section adquiere acceso exclusivo a un recurso compartido, lo que evita el acceso de lectura simultáneo.

Al igual que la clase critical_section, la clase reader_writer_lock representa un objeto cooperativo de exclusión mutua que cede ante otras tareas en lugar de adelantarse a ellas.

Cuando un subproceso que tiene que escribir en un recurso compartido adquiere un bloqueo de lectura o escritura, se bloquean otros subprocesos que también tienen que obtener acceso al recurso hasta que el sistema de escritura libera el bloqueo.La clase reader_writer_lock es un ejemplo de un bloqueo de preferencia de escritura, que desbloquea los sistemas de escritura en espera antes de desbloquear los lectores en espera.

Al igual que la clase critical_section, la clase reader_writer_lock no es reentrante.El concurrency::reader_writer_lock::lock y concurrency::reader_writer_lock::lock_read métodos producen una excepción de tipo improper_lock si se llama a un subproceso que ya posee el bloqueo.

[!NOTA]

Dado que la clase reader_writer_lock no es una clase reentrante, un bloqueo de solo lectura no se puede actualizar a un bloqueo de lectura o escritura ni un bloqueo de lectura o escritura se puede degradar a un bloqueo de solo lectura.Si se realiza alguna de estas operaciones, se produce un comportamiento inesperado.

Dd492638.collapse_all(es-es,VS.110).gifMétodos y características

En la tabla siguiente se muestran los métodos importantes definidos por la clase reader_writer_lock.

Método

Descripción

bloquear

Adquiere acceso de lectura y escritura al bloqueo.

try_lock

Intenta adquirir acceso de lectura y escritura al bloqueo, pero no se bloquea.

lock_read

Adquiere acceso de solo lectura al bloqueo.

try_lock_read

Intenta adquirir acceso de solo lectura al bloqueo, pero no se bloquea.

unlock

Libera el bloqueo.

Top

scoped_lock y scoped_lock_read

Las clases reader_writer_lock y critical_section proporcionan clases auxiliares anidadas que simplifican la forma en que se usan los objetos de exclusión mutua.Estas clases auxiliares se denominan bloqueos con ámbito.

El critical_section clase contiene el concurrency::critical_section::scoped_lock clase.El constructor adquiere acceso al objeto critical_section proporcionado; el destructor libera el acceso a dicho objeto.El reader_writer_lock clase contiene el concurrency::reader_writer_lock::scoped_lock (clase), que es similar a critical_section::scoped_lock, salvo que administra el acceso de escritura a los reader_writer_lock objeto.El reader_writer_lock clase también contiene el concurrency::reader_writer_lock::scoped_lock_read clase.Esta clase administra el acceso de lectura al objeto reader_writer_lock proporcionado.

Los bloqueos con ámbito ofrecen varias ventajas cuando se usan los objetos reader_writer_lock y critical_section manualmente.Normalmente, se asigna un bloqueo con ámbito en la pila.Un bloqueo con ámbito libera automáticamente el acceso a su objeto de exclusión mutua cuando se destruye; por consiguiente, no se desbloquea manualmente el objeto subyacente.Esto resulta útil cuando una función contiene varias instrucciones return.Los bloqueos con ámbito también pueden ayudar a escribir código seguro ante excepciones.Cuando una instrucción throw hace que se desenrede la pila, se invoca el destructor de cualquier bloqueo con ámbito activo, por lo que se libera siempre correctamente el objeto de exclusión mutua.

[!NOTA]

Cuando use las clases critical_section::scoped_lock, reader_writer_lock::scoped_lock_read y reader_writer_lock::scoped_lock, no libere manualmente el acceso al objeto de exclusión mutua subyacente.De ese modo, es posible que el runtime pase a un estado no válido.

event

El concurrency::event clase representa un objeto de sincronización cuyo estado puede ser señalado o no señalado.A diferencia de los objetos de sincronización, cuyo propósito es proteger el acceso a los datos compartidos (por ejemplo, las secciones críticas), los eventos sincronizan el flujo de ejecución.

La clase event resulta útil cuando una tarea ha completado el trabajo de otra tarea.Por ejemplo, una tarea podría señalar a otra tarea que ha leído datos de una conexión de red o de un archivo.

Dd492638.collapse_all(es-es,VS.110).gifMétodos y características

En la tabla siguiente, se muestran varios de los métodos importantes definidos por la clase event.

Método

Descripción

wait

Espera a que se señale el evento.

set

Establece el evento en el estado señalado.

reset

Establece el evento en el estado no señalado.

wait_for_multiple

Espera a que se señalen varios eventos.

Dd492638.collapse_all(es-es,VS.110).gifEjemplo

Para obtener un ejemplo en el que se muestra cómo usar la clase event, vea Comparar estructuras de datos de sincronización con la API de Windows.

Top

Secciones relacionadas