C++ 11 standard określa unique_lock::unlock
jak (§ 30.4.2.2.2, p 1159).Czy unique_lock :: unlock underspecified w standardzie 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.
Wszystkie pozostałe operacje blokowania określić, że wyjątek jest co najmniej dwa razy:
- muteksu NULL (rzuty
system_error
zerrc::operation_not_permitted
) - muteksu jest już zablokowany (rzuty
system_error
zerrc::operation_not_permitted
)
Problem z nieprawidłowym muteksem jest oczywiście możliwy również dla unlock
, jednak norma określa zachowanie programu tylko w przypadku problemów z blokowaniem. Czy to prawdziwy błąd w standardzie czy coś mi brakuje?
Nie jestem pewien, czy podążam. Dlaczego jest "oczywiście możliwe", aby 'unlock' został wywołany, gdy muteks jest nieważny? Możesz wywnioskować, że jako efekt 'unlock()' jest 'pm-> unlock()', aby uniknąć niezdefiniowanego zachowania 'pm' nie może mieć wartości null i musi być spełniona umowa dla' BasicLockable' '* pm' , więc blokada musi być własnością bieżącego agenta wykonawczego. Czy jest jakaś subtelność, której mi brakuje? –