zoukankan      html  css  js  c++  java
  • 22.线程自解锁

    代码结构比较复杂的情况下,手动加锁,解锁,可能会有所遗漏。

    这种情况下,推荐使用自解锁(自解锁在构造的时候lock,在析构的时候unlock)(对象在超出作用域时会执行析构)

    自解锁,手动锁优缺点:自解锁每次都会构造,析构。在执行效率上没有手动锁效率高。

    演示代码:

    示例一:手动加锁,解锁(要在每个代码分支的地方保证解锁)

    #include <iostream>
    #include <thread>
    #include <mutex>
    
    using namespace std;
    
    mutex m_lock;
    
    void workFun(int index)
    {
    
        for (int i = 0; i < 1000; i++)
        {
    
            m_lock.lock();
            if (i > 500)
            {
                m_lock.unlock();
                return;
            }
            
            cout << index << " child thread " << i << endl;
            m_lock.unlock();
    
        }
    
    }//抢占式
    
    int main()
    {
        thread t[3];
        for (int n = 0; n<3; n++)
        {
            t[n] = thread(workFun, n);
        }
    
        for (int n = 0; n<3; n++)
        {
            t[n].join();
        }
    
        for (int i = 0; i<4; i++)
            cout << "i am main thread " << i << endl;
        return 0;
    }

    示例二:自解锁(构造对象时执行了枷锁,在析构对象时执行了解锁)

    #include <iostream>
    #include <thread>
    #include <mutex>
    
    using namespace std;
    
    mutex m_lock;
    
    void workFun(int index)
    {
    
        for (int i = 0; i < 1000; i++)
        {
            lock_guard<mutex> gl(m_lock);
            //m_lock.lock();
            if (i > 500)
            {
                //m_lock.unlock();
                return;
            }
            
            cout << index << " child thread " << i << endl;
            //m_lock.unlock();
    
        }
    
    }//抢占式
    
    int main()
    {
        thread t[3];
        for (int n = 0; n<3; n++)
        {
            t[n] = thread(workFun, n);
        }
    
        for (int n = 0; n<3; n++)
        {
            t[n].join();
        }
    
        for (int i = 0; i<4; i++)
            cout << "i am main thread " << i << endl;
        return 0;
    }
  • 相关阅读:
    [CQOI2005]三角形面积并(计算几何+扫描线)
    第一天
    LA3026 周期 (kmp)
    HDU 1715 大菲波数 (java大数)
    根据身高重建队列(vector)
    K 连续位的最小翻转次数
    724. Find Pivot Index
    Two Sum
    c
    Most Powerful(状压DP水题)
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/14374664.html
Copyright © 2011-2022 走看看