在代码的其他部分使用与 lock_gard 相同的互斥锁并且不使用它是否安全

Ami*_*sti 4 c++ multithreading mutex raii thread-safety

我有一个命名空间,下面的 func1 和 func2 将从不同的线程调用。

#include<thread>
namespace test{

    std::mutex mu;

    void func1(){
        std::lock_guard<mutex>lock(mu);
       //the whole function needs to be protected
    }

    void func2() {
        mu.lock();
        //some code that should not be executed when func1 is executed
        mu.unlock();
        //some other code
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此互斥锁(一次与 lock_guard 一起使用并在其外部)来保护这些关键部分是否安全?如果不是如何实现这个逻辑?

sel*_*bie 6

是的,您可以在不同的函数中有效地混合和匹配不同的保护实例(例如lock_guard、unique_lock 等...)std::mutex。我偶尔遇到的一种情况是,当我想使用std::lock_guard大多数方法,但使用 std::condition_variable期望 astd::unique_lock作为其wait方法时。

为了详细说明 Oblivion 所说的内容,我通常会在函数中引入一个新的作用域块,以便使用std::lock_guard一致。例子:

void func2() {

    {  // ENTER LOCK
        lock_guard<std::mutex> lck;

       //some code that should not be executed when func1 is executed

    } // EXIT LOCK

    // some other (thread safe) code 
}
Run Code Online (Sandbox Code Playgroud)

使用上述模式的优点是,如果在锁定的代码关键部分内有任何异常抛出,则lck仍会调用 的析构函数,从而解锁互斥体。