C++ named requirements: Mutex (since C++11)
From cppreference.net
Los Mutex requirements extienden los Lockable requirements para incluir sincronización entre hilos.
Contenidos |
Requisitos
- Lockable
- DefaultConstructible
- Destructible
- no copiable
- no movible
Para un objeto
m
de tipo
Mutex
:
- La expresión m. lock ( ) tiene las siguientes propiedades
-
- Se comporta como una operación atómica.
- Bloquea el hilo de llamada hasta que se pueda obtener la propiedad exclusiva del mutex.
- Las operaciones previas m. unlock ( ) en el mismo mutex sincronizan-con esta operación de bloqueo (equivalente a liberación-adquisición std::memory_order ).
- El comportamiento es indefinido si el hilo de llamada ya posee el mutex (excepto si m es std::recursive_mutex o std::recursive_timed_mutex ).
- Puede lanzarse una excepción de tipo std::system_error en caso de errores, con los siguientes códigos de error:
-
- std::errc::operation_not_permitted si el hilo de llamada no tiene los privilegios requeridos.
- std::errc::resource_deadlock_would_occur si la implementación detecta que esta operación conduciría a un interbloqueo.
- La expresión m. try_lock ( ) tiene las siguientes propiedades
-
- Se comporta como una operación atómica.
- Intenta obtener la propiedad exclusiva del mutex para el hilo que realiza la llamada sin bloquear. Si no se obtiene la propiedad, retorna inmediatamente. Se permite que la función falle espuriamente y retorne incluso si el mutex no está actualmente en posesión de otro hilo.
-
Si
try_lock()tiene éxito, las operaciones previas deunlock()en el mismo objeto sincronizan-con esta operación (equivalente a liberación-adquisición std::memory_order ).lock()no se sincroniza con untry_lock()fallido. - No lanza excepciones.
- La expresión m. unlock ( ) tiene las siguientes propiedades
-
- Se comporta como una operación atómica.
- Libera la propiedad del mutex del hilo que realiza la llamada y sincroniza-con las posteriores operaciones de bloqueo exitosas en el mismo objeto.
- El comportamiento es indefinido si el hilo que realiza la llamada no posee el mutex.
- No lanza excepciones.
- Todas las operaciones de bloqueo y desbloqueo en un único mutex ocurren en un único orden total que puede verse como orden de modificación de una variable atómica: el orden es específico de este mutex individual.
Biblioteca estándar
Los siguientes tipos de la biblioteca estándar satisfacen Mutex requisitos:
|
(C++11)
|
proporciona funcionalidad básica de exclusión mutua
(clase) |
|
(C++11)
|
proporciona funcionalidad de exclusión mutua que puede ser bloqueada recursivamente por el mismo hilo
(clase) |
|
(C++11)
|
proporciona funcionalidad de exclusión mutua que puede ser bloqueada recursivamente
por el mismo hilo e implementa bloqueo con tiempo de espera (clase) |
|
(C++17)
|
proporciona funcionalidad de exclusión mutua compartida
(clase) |
|
(C++14)
|
proporciona funcionalidad de exclusión mutua compartida e implementa bloqueo con tiempo de espera
(clase) |
|
(C++11)
|
proporciona funcionalidad de exclusión mutua que implementa bloqueo con tiempo de espera
(clase) |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2309 | C++11 |
lock
podría lanzar
std::system_error
con código de error std::errc::device_or_resource_busy |
no permitido |