I C++ 11 norma definisce unique_lock::unlock
come (§ 30.4.2.2.2, p 1159.)È unique_lock :: unlock sotto specificato nello standard 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.
Tutte le altre operazioni di bloccaggio specificano che viene generata un'eccezione in almeno due occasioni:
- il mutex è NULL (getta
system_error
conerrc::operation_not_permitted
) - il mutex è già bloccato (tiri
system_error
conerrc::operation_not_permitted
)
Il problema con mutex non valido è ovviamente possibile anche per unlock
, tuttavia lo standard specifica il comportamento del programma solo per i problemi di blocco. È un vero errore nello standard o mi manca qualcosa?
Non sono sicuro di seguirlo. Perché è "ovviamente possibile" che "unlock" venga chiamato quando il mutex non è valido? Si può dedurre che l'effetto di 'unlock()' è 'pm-> unlock()', che per evitare un comportamento indefinito 'pm' non deve essere nullo e il contratto per' BasicLockable' '* pm' deve essere soddisfatto , quindi il blocco deve essere di proprietà dell'agente di esecuzione corrente. C'è qualche sottigliezza che mi manca? –