在与 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.
}