recursive_mutex、timed_mutex和recursive_timed_mutex

一、recursive_mutex

class MyClass
{
public:
    void Fun1()
    {
        // std::lock_guard<mutex> sguard(m_mutex);  // 加锁处理共享内存
        std::lock_guard<recursive_mutex> sguard(m_recurMutex);  // 用递归锁能够多次加锁,效率更低
        // 用到recursive_mutex 需要考虑代码是否有优化空间,所以尽可能不要在代码中出现 recursive_mutex

        // ...
        Fun2();   // 调用Fun2(),中间也加锁了,所以程序会崩溃,mutex 不能多次lock

    }
    void Fun2()
    {
        // std::lock_guard<mutex> sguard(m_mutex);  // 加锁处理共享内存
        std::lock_guard<recursive_mutex> sguard(m_recurMutex);  // 

        // ...
    }
    
private:
    mutex m_mutex;
    recursive_mutex m_recurMutex;  // 递归的独占互斥量
    // 允许同一个线程中,同一个互斥量被多次lock
};

二、timed_mutex和recursive_timed_mutex

class MyClass
{
public:
    void Fun2()
    {
        std::chrono::milliseconds time(100);
        //if (m_timeMutex.try_lock_for(time))   //try_lock_for()  表示等待100毫秒
        if (m_timeMutex.try_lock_until(chrono::steady_clock::now() + time)) 
        // 等待直到现在的时间点 + time 的时刻
        {
            // 如果拿到锁,则执行操作共享内存的操作
            m_timeMutex.unlock();   // 用完之后需要解锁
        }
        else
        {
            // 没拿到锁时,所执行的操作
            // 例如:没拿到锁的时候休息1秒
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    }
    
private:
    timed_mutex m_timeMutex;   // 带超时功能的独占互斥量
    // 拿不到锁的时候会等待一段时间,如果还拿不到,会往下执行
    //       try_lock_for() : 等待一段时间,如果拿到锁,或者等待超过时间没有拿到锁,就直接往下走
    //       try_lock_until() : 参数是一个未来的时间点,在这个未来的时间没到的时间内
    //                    如果拿到了所,就走下来,如果时间到了,没拿到锁,程序流程也走下来
    recursive_timed_mutex m_timeRecurMutex;  // 可以多次lock的 timed_mutex

};

 

posted @ 2020-06-27 19:41  min_zhi  阅读(425)  评论(0编辑  收藏  举报