带有重复参数的Scoped_lock

我使用 std::scoped_lock 来保护多线程环境中的对象对。但我发现 scoped_lock 如果两个参数相同,会导致死锁(在 Visual Studio 和 gcc 中)。例如,

#include <mutex>

struct S
{
    mutable std::mutex m;
    int v = 0;
    S & operator = ( const S & b )
    {
        std::scoped_lock l( m, b.m );
        v = b.v;
        return * this;
    }
};

int main()
{
    S a;
    a = a; //deadlock here!
}

我看到标准要求“如果 MutexTypes 之一不是递归互斥体,并且当前线程已经在 ... 中拥有相应的参数,则行为未定义”,请参阅
https://en.cppreference.com/w/cpp/线程/scoped_lock/scoped_lock

但是在我的示例中,在形式上,互斥锁在 scoped_locked 之前没有锁定。那么这是预期的程序行为吗?

以上是带有重复参数的Scoped_lock的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>