![](/img/trans.png)
[英]When to use C++11 mutex, lock, unique_lock, shared_lock, etc
[英]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.
所有其他锁定操作都指定至少两次抛出异常:
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()
不能抛出。
pm
是mutex_type
, std::mutex
unlock定义是:
void unlock() noexcept;
也就是说, unlock
函数不能抛出任何异常,因此unique_lock::unlock
不必继承任何异常。 至于为什么它可以抛出任何异常都是一个谜。
unique_lock
的析构unique_lock
可能会抛出异常(因为我猜它可能必须调用unlock
也可以),这有点令人讨厌。 这对我来说似乎很糟糕,因为在异常处理期间使用锁定对象来正确解锁是一种非常常见的习惯用法。 锁定在堆栈展开期间抛出异常非常糟糕 - 特别是因为不允许使用底层互斥锁。
这里肯定是错的。
我还在上次公开选秀中工作,也许这是固定的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.