码迷,mamicode.com
首页 > 其他好文 > 详细

recursive_mutex、timed_mutex和recursive_timed_mutex

时间:2020-06-27 20:25:35      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:until   流程   else   time   空间   seconds   lock   lis   不能   

一、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

};

 

recursive_mutex、timed_mutex和recursive_timed_mutex

标签:until   流程   else   time   空间   seconds   lock   lis   不能   

原文地址:https://www.cnblogs.com/zhiminzeng/p/13199537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!