推荐的使用方式 mutex
用于锁定代码的关键区域是通过 RAII,即
mutex_type mutex;
{ // start of critical region
std::lock_guard<mutex_type> lock(mutex); // first statement in critical region
// ... do critical stuff, may throw an exception
} // end of critical region
这样当在临界区内抛出异常时,互斥量仍将被解锁(由 std::lock_guard
的析构函数)。然而,这样的成员mutex::lock()
和 mutex::unlock()
永远不会被用户代码显式调用。
Q mutex::lock()
的主要惯用显式用法是什么(如果有的话) ?
我在问,否则 mutex::lock()
就没有意义了宣传错误代码的公共(public)成员(避免 std::lock_guard
的代码)。
编辑
由于两者 std::lock_guard<>
和 std::mutex
在同一个标题中定义,std::mutex
很容易成为 friend std::lock_guard<std::mutex
并有它的lock()
和 unlock()
protected 方法:
class mutex // use only with lock_guard<mutex>
{
friend class lock_guard<mutex>; // support acquire-release semantic via RAII
friend class scoped_lock_guard<mutex>; // for supporting more complicated semantic,
// possibly remembering the mutex state.
// ...
protected:
void lock();
bool try_lock();
void unlock();
};
class raw_mutex // use if you absolutely must explicitly lock, try_lock, or unlock
: public mutex
{
public:
using mutex::lock;
using mutex::try_lock;
using mutex::unlock;
};
一个论点 回答我的问题很简单,唯一的异常安全方法是使用 mutex::lock()
通过 RAII。因此,唯一明智的显式使用必须只涉及 noexcept
调用 lock
之间的方法(或 try_lock
)和 unlock
.然而,由于 noexcept
只是暗示性的,没有任何 promise ,这样的使用是不安全的。 问正确吗?
最佳答案
lock_guard
并不是唯一需要在 mutex
上调用 lock
/unlock
的东西。 unique_lock
、lock
、try_lock
和 condition_variable_any
都必须在互斥体上工作。那只是标准类型。在这种情况下,友元引入了成为障碍的紧密耦合。
关于c++ - 是否有任何惯用的显式使用 mutex::lock() 或 unlock()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873082/