C++ 11标准将unique_lock::unlock
定义为(§30.4.2.2.2,第1159页)
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.
所有其他锁定操作均指定至少在两种情况下引发异常:
system_error
与errc::operation_not_permitted
一起抛出)system_error
抛出errc::operation_not_permitted
)unlock
显然也可能存在无效互斥锁的问题,但是,该标准仅针对锁定问题指定了程序的行为。这是标准中的真正错误,还是我遗漏了一些东西? 最佳答案
尽管未明确说明,但unique_lock
具有以下不变量:
if pm == nullptr then owns == false
if owns == true then pm != nullptr
除了通过未定义的行为,没有其他方法可以使
unique_lock
进入违反这些不变式的状态。因此该子句:— operation_not_permitted — if on entry owns is false.
涵盖了
pm == nullptr
的情况。请注意,
~unique_lock()
仅在pm->unlock()
为true时才调用owns
。如果owns
为true,则pm != nullptr
和unlock()
不能抛出。关于c++ - 在C++ 11标准中,unique_lock::unlock是否未指定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8552601/