Los C++ 11 define estándar unique_lock::unlock
como (§ 30.4.2.2.2, p 1159.)¿unique_lock :: unlock no está especificado en el estándar C++ 11?
void unlock();
Effects: pm->unlock()
Postcondition: owns == false
Throws: system_error when an exception is required (30.2.2).
Error conditions:
— operation_not_permitted — if on entry owns is false.
Todas las demás operaciones de bloqueo especifican que se produce una excepción en al menos dos ocasiones:
- El mutex es NULL (lanza
system_error
conerrc::operation_not_permitted
) - El mutex ya está bloqueado (lanza
system_error
conerrc::operation_not_permitted
)
El problema con el mutex no válido es obviamente posible para unlock
, sin embargo, el estándar especifica el comportamiento del programa solo para los problemas de bloqueo. ¿Es un error real en el estándar o me falta algo?
No estoy seguro de seguir. ¿Por qué es "obviamente posible" que se llame a 'desbloquear' cuando el mutex no es válido? Puede inferir que como el efecto de 'unlock()' es 'pm-> unlock()', para evitar el comportamiento indefinido 'pm' no debe ser nulo y debe cumplirse el contrato del' BasicLockable' '* pm' , por lo que el bloqueo debe ser propiedad del agente de ejecución actual. ¿Hay alguna sutileza que me estoy perdiendo? –