使用 C++ lock_guard 时如何收紧范围?
How to tighten the scope when using C++ lock_guard?
在 C++ 中,lock_guard
允许您在使用锁时符合 RAII。它在构造 lock_guard
时调用 lock()
,一旦它超出范围就会在销毁它时调用 unlock()
。
是否可以收紧 lock_guard
的范围,以便更快地销毁它,以避免持有锁的时间过长?
我不是 100% 确定你的意思,但是你可以像这样用大括号为 std::lock_guard
引入一个块作用域:
void foo()
{
// do uncritical stuff
{
// critical part starts here with construction
std::lock_guard<std::mutex> myLock(someMutex);
// do critical stuff
} // critical parts end here with myLock going out of scope
// do uncritical stuff
}
可以使用 unique_lock
守卫代替 lock_guard
。 unique_lock
为您提供与 lock_guard
相同的 RAII 保证(在构建 lock_guard 时调用 lock()
,在销毁时调用 unlock()
),以及公开 lock()
和 unlock()
允许您自己锁定和解锁。
使用 unique_lock
,您可以在关键路径之前 lock()
,然后直接 unlock()
。
unique_lock
只会在析构函数中调用 unlock()
如果之前已获取锁,因此没有两次释放锁的风险(这会导致未定义的行为)。
在 C++ 中,lock_guard
允许您在使用锁时符合 RAII。它在构造 lock_guard
时调用 lock()
,一旦它超出范围就会在销毁它时调用 unlock()
。
是否可以收紧 lock_guard
的范围,以便更快地销毁它,以避免持有锁的时间过长?
我不是 100% 确定你的意思,但是你可以像这样用大括号为 std::lock_guard
引入一个块作用域:
void foo()
{
// do uncritical stuff
{
// critical part starts here with construction
std::lock_guard<std::mutex> myLock(someMutex);
// do critical stuff
} // critical parts end here with myLock going out of scope
// do uncritical stuff
}
可以使用 unique_lock
守卫代替 lock_guard
。 unique_lock
为您提供与 lock_guard
相同的 RAII 保证(在构建 lock_guard 时调用 lock()
,在销毁时调用 unlock()
),以及公开 lock()
和 unlock()
允许您自己锁定和解锁。
使用 unique_lock
,您可以在关键路径之前 lock()
,然后直接 unlock()
。
unique_lock
只会在析构函数中调用 unlock()
如果之前已获取锁,因此没有两次释放锁的风险(这会导致未定义的行为)。