mutex.lock 对比 unique_lock
mutex.lock vs unique_lock
什么时候我应该更喜欢第一段代码而不是第二段代码,它们有根本的区别吗
std::mutex mtx;
mtx.lock();
... //protected stuff
mtx.unlock();
... //non-protected stuff
mtx.lock();
... //etc
和
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
... //protected stuff
lck.unlock();
... //non-protected stuff
lck.lock();
... //etc
我明白 lock_guard 基本上是 unique_lock 没有锁定和解锁功能,但我很难区分互斥锁和使用互斥锁的锁。
是的,std::unique_lock
在其析构函数中调用互斥量解锁。
这样做的好处是,如果抛出某些异常,您可以确定互斥量在离开 std::unique_lock
定义的范围时会解锁。
这样想:
// define a mutex
std::mutex mtx;
...很久以后...
void something_safe()
{
// code in these braces is a critical section
{
auto lock = std::unique_lock<std::mutex>(mtx); // equivalent to mtx.lock();
... //protected stuff
} // <---- however you leave this brace, equivalent to mtx.unlock();
... //non-protected stuff
}
什么时候我应该更喜欢第一段代码而不是第二段代码,它们有根本的区别吗
std::mutex mtx;
mtx.lock();
... //protected stuff
mtx.unlock();
... //non-protected stuff
mtx.lock();
... //etc
和
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
... //protected stuff
lck.unlock();
... //non-protected stuff
lck.lock();
... //etc
我明白 lock_guard 基本上是 unique_lock 没有锁定和解锁功能,但我很难区分互斥锁和使用互斥锁的锁。
是的,std::unique_lock
在其析构函数中调用互斥量解锁。
这样做的好处是,如果抛出某些异常,您可以确定互斥量在离开 std::unique_lock
定义的范围时会解锁。
这样想:
// define a mutex
std::mutex mtx;
...很久以后...
void something_safe()
{
// code in these braces is a critical section
{
auto lock = std::unique_lock<std::mutex>(mtx); // equivalent to mtx.lock();
... //protected stuff
} // <---- however you leave this brace, equivalent to mtx.unlock();
... //non-protected stuff
}