-1

我想创建自己的互斥类以用于std::lock_guard等。我有一个简单的实现:

class A
{
    std::mutex m;

public:
    void lock() {
        m.lock();
    }

    void unlock() {
        m.unlock();
    }
};

但是使用 MSVC 编译时,它会发出警告caller failing to hold lock before calling function std::_Mutex_base::unlock。这是为什么?

4

1 回答 1

-1

我认为来自编译器的警告是公平的,它说解锁功能可能会尝试解锁未锁定的互斥锁,请参阅https://www.cplusplus.com/reference/mutex/mutex/unlock/

如果互斥锁当前没有被调用线程锁定,它会导致未定义的行为。

未定义的行为是一件非常非常糟糕的事情,所以那里的警告很好,好像这种情况发生了那么你就有麻烦了。

因此,我认为使用 std::mutex 对此您无能为力。但是,如果您使用的是 posix mutex,它会返回一个错误代码,我猜您可能会忽略:https ://linux.die.net/man/3/pthread_mutex_unlock然后对其他错误代码做出反应。

EPERM 当前线程不拥有互斥锁。

于 2021-10-03T14:14:42.650 回答