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.

所有其他锁定操作均指定至少在两种情况下引发异常:
  • 互斥锁为NULL(将system_errorerrc::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 != nullptrunlock()不能抛出。

    关于c++ - 在C++ 11标准中,unique_lock::unlock是否未指定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8552601/

    10-11 17:59