在与 unique_lock 关联的互斥量上调用解锁会导致未定义的行为
Calling unlock on a mutex associated with a unique_lock causes undefined behavior
我写了一个简单的代码,我用 unique_lock 解锁了互斥锁,而不是调用锁本身的解锁。当第一个线程进入临界区并调用my_mutex.unlock()时,许多其他线程一起进入临界区。
std::mutex my_mutex;
void sample() {
std::unique_lock<std::mutex> lock(my_mutex);
// Critical section
my_mutex.unlock();
}
为什么会这样?在 unique_lock 持有的互斥量上调用 unlock 是错误的吗?谢谢!
UB 不是由使用 std::mutex::unlock
的显式解锁引起的,而是由 std::unique_lock
析构函数在退出作用域时执行的第二次解锁引起的。
从cppreference.com调用std::mutex::unlock
时:
The mutex must be locked by the current thread of execution, otherwise, the behavior is undefined.
解决方案是不对互斥量执行显式解锁。相反,让 std::unique_lock
按预期在销毁时自行解锁。
对于需要在销毁前释放锁的情况,使用 std::unique_lock::unlock
这将允许安全销毁。或者你可以简单地插入一个额外的范围,e.g.:
void sample() {
// Before.
{
std::unique_lock<std::mutex> lock(my_mutex);
// Critical section.
}
// After.
}
我写了一个简单的代码,我用 unique_lock 解锁了互斥锁,而不是调用锁本身的解锁。当第一个线程进入临界区并调用my_mutex.unlock()时,许多其他线程一起进入临界区。
std::mutex my_mutex;
void sample() {
std::unique_lock<std::mutex> lock(my_mutex);
// Critical section
my_mutex.unlock();
}
为什么会这样?在 unique_lock 持有的互斥量上调用 unlock 是错误的吗?谢谢!
UB 不是由使用 std::mutex::unlock
的显式解锁引起的,而是由 std::unique_lock
析构函数在退出作用域时执行的第二次解锁引起的。
从cppreference.com调用std::mutex::unlock
时:
The mutex must be locked by the current thread of execution, otherwise, the behavior is undefined.
解决方案是不对互斥量执行显式解锁。相反,让 std::unique_lock
按预期在销毁时自行解锁。
对于需要在销毁前释放锁的情况,使用 std::unique_lock::unlock
这将允许安全销毁。或者你可以简单地插入一个额外的范围,e.g.:
void sample() {
// Before.
{
std::unique_lock<std::mutex> lock(my_mutex);
// Critical section.
}
// After.
}