您可以在同一块中的互斥锁lock_guard之前添加代码吗

cod*_*der 3 c++ mutex

因此,这可能是一个显而易见的答案,但我只是有一个疑问,因为我没有看到它的使用...

因此,使用普通的互斥锁,您可以执行以下操作:

void func1()
{
    mymutex.lock();
    // do func1 stuff on shared data
    mymutex.unlock();
}

void func2()
{
    func1(); // also uses mymutex

    mymutex.lock();
    // do func2 stuff on shared data
    mymutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

在这里我们可以轻松地看到互斥锁部分的开始/结束。

但是使用lock_guard可以做同样的事情,即:

void func1()
{
    std::lock_guard<std::mutex> g(mymutex);
    // do func1 stuff on shared data
}

void func2()
{
    func1(); // also uses lock_guard on mymutex

    std::lock_guard<std::mutex> g(mymutex);
    // do func2 stuff on shared data
}
Run Code Online (Sandbox Code Playgroud)

在这里,我的疑问是通常您使用lock_guard来保护完整的c ++块。但是在func2中,我首先调用func1(它本身使用相同的互斥锁),然后调用func1 之后一块中调用lock_gaurd 。

可以/安全吗?还是func2中的lock_guard对func1有影响?

我最初以为可以,但是后来我的大脑开始告诉我这把锁可疑。我可以轻松地在func2 lock_guard周围粘贴一个块-但是现在我需要知道它是否还可以,然后我才能再次入睡:o

niv*_*led 9

很安全 请现在就去睡觉:)

终止锁定防护(退出其作用域)时,将自动为您执行解锁功能

在这里看到更多

类lock_guard是一个互斥量包装器,它提供了一种方便的RAII风格的机制来在作用域块的持续时间内拥有一个互斥量。

创建lock_guard对象时,它将尝试获取它所提供的互斥锁的所有权。当控制离开在其中创建lock_guard对象的作用域时,将破坏lock_guard并释放互斥量。

lock_guard类是不可复制的。