Requisitos denominados de C++:SharedMutex(desde C++17)
Los requisitos de MutexCompartido extienden los requisitos de Mutex para incluir la modalidad de posesión compartida de un cerrojo.
[editar]Requisitos
Adicionalmente, un objeto m
de tipo MutexCompartido admite otro tipo de posesión: compartida. Varios hilos (o, más generalmente, agentes de ejecución) pueden poseer simultáneamente este mutex en modalidad compartida, pero ningún hilo puede tomar posesión compartida si hay un hilo que lo posee en modalidad exclusiva, y ningún hilo puede tomar posesión exclusiva si hay un hilo que lo posee en modalidad compartida. Si más del número de hilos definido por la implementación (no menos de 10000) mantienen un cerrojo compartido, otro intento de adquirir el mutex en modalidad compartida se bloquea hasta que el número de propietarios compartidos descienda por debajo de ese umbral.
- La expresión m.lock_shared() tiene las siguientes propiedades:
- Se comporta como una operación atómica.
- Bloquea al hilo llamante hasta que se pueda tomar posesión compartida del mutex.
- Las operaciones m.unlock() anteriores en el mismo mutex se sincronizan-con esta operación de bloqueo (equivalente a liberar-tomarstd::memory_order ).
- El comportamiento no está definido si el hilo llamante ya posee el mutex en cualquier modalidad.
- Si se lanza una excepción, no se toma posesión del cerrojo compartido.
- La expresión m.try_lock_shared() tiene las siguientes propiedades:
- Se comporta como una operación atómica.
- Intenta tomar posesión compartida del mutex para el hilo llamante sin bloquearse. Si no se obtiene la posesión compartida, regresa inmediatamente. Se permite que la función falle falsamente (spuriously) y regrese incluso si el mutex no es propiedad de ningún hilo en ninguna modalidad.
- Si
try_lock_shared()
tiene éxito, las operacionesunlock()
anteriores en el mismo objeto se sincronizan-con esta operación (equivalente a liberar-tomarstd::memory_order ). - El comportamiento no está definido si el hilo llamante ya posee el mutex en cualquier modalidad.
- La expresión m.unlock_shared() tiene las siguientes propiedades:
- Se comporta como una operación atómica.
- Libera la posesión del mutex del hilo llamante y se sincroniza-con las siguientes operaciones de bloqueo exitosas en el mismo objeto.
- El comportamiento no está definido si el hilo llamante no posee el mutex.
- Todas las operaciones de bloqueo y desbloqueo en un solo mutex ocurren en un solo orden total.
[editar]Biblioteca estándar
Los siguientes tipos de la biblioteca estándar satisfacen los requisitos de MutexCompartido:
(C++17) | Proporciona un servicio de exclusión mutua compartida. (clase) |
(C++14) | Proporciona un servicio de exclusión mutua compartida e implementa bloqueo con un tiempo de espera. (clase) |