繁体   English   中英

在C ++ 11标准中,unique_lock :: unlock是否未指定?

[英]Is unique_lock::unlock underspecified in the C++11 standard?

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(使用errc::operation_not_permitted抛出system_error
  • 互斥锁已被锁定(使用errc::operation_not_permitted抛出system_error

无效互斥的问题显然也可以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的情况。

请注意,如果owns为true,则~unique_lock()仅调用pm->unlock() 如果owns为true,则pm != nullptr ,因此unlock()不能抛出。

pmmutex_typestd::mutex unlock定义是:

void unlock() noexcept;

也就是说, unlock函数不能抛出任何异常,因此unique_lock::unlock不必继承任何异常。 至于为什么它可以抛出任何异常都是一个谜。

unique_lock的析构unique_lock可能会抛出异常(因为我猜它可能必须调用unlock也可以),这有点令人讨厌。 这对我来说似乎很糟糕,因为在异常处理期间使用锁定对象来正确解锁是一种非常常见的习惯用法。 锁定在堆栈展开期间抛出异常非常糟糕 - 特别是因为不允许使用底层互斥锁。

这里肯定是错的。

我还在上次公开选秀中工作,也许这是固定的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM