代码之家  ›  专栏  ›  技术社区  ›  Amir Rasti

在代码的其他部分使用带锁的同一互斥锁和不带锁的同一互斥锁安全吗

  •  0
  • Amir Rasti  · 技术社区  · 7 年前

    我有一个名称空间,在该名称空间下,将从不同的线程调用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
        }
    }
    

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

    3 回复  |  直到 7 年前
        1
  •  4
  •   selbie    7 年前

    是的,您可以有效地混合和匹配不同的保护实例(例如锁定保护、唯一锁定等)具有 std::mutex 在不同的功能中。我偶尔遇到的一个情况是当我想使用 std::lock_guard std::condition_variable 期待 std::unique_lock wait

    为了详细说明Oblivion所说的话,我通常在函数中引入一个新的作用域块,以便 标准:锁紧装置

    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 
    }
    

    使用上述模式的优点是,若任何东西在锁下的关键代码段内抛出异常,则 lck 仍将被调用,因此将解锁互斥锁。

        2
  •  3
  •   Ulrich Eckhardt    7 年前

    一切 lock_guard lock() unlock()

        3
  •  2
  •   Oblivion    7 年前

    死锁发生在至少两个 mutex 你是参与还是单身 互斥

    第二个功能的唯一问题是,如果出现异常,锁将不会释放。

    你可以简单地使用 lock_guard 或者任何其他被破坏(并在dtor处解锁互斥)以避免第一个函数中出现的情况。