zoukankan      html  css  js  c++  java
  • 23.线程锁的使用

    不合理的设定临界区域,会让线程的调用失去意义。

    1.不应该频繁的使用锁

    2.减小锁使用的区域,线程公共资源之外 的资源 尽量不要放到临界区。

    -------------------------------------------------------------------------------------------------------

     示例一:(这样使用线程锁,设定的临界区域不合理,会让线程的调用失去意义,线程并没有并发执行)

    #include <iostream>
    #include <thread>
    #include <mutex>
    
    using namespace std;
    
    mutex m_lock;
    
    int sum = 0;
    
    void workFun(int index)
    {
        m_lock.lock();
        for (int i = 0; i < 1000; i++)
        {
            sum++;
            cout << "thread:"<<index << " sum=" << sum<<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();
        }
    
        cout << "sum=" << sum << endl;
        cout << "i am main thread " << endl;
        return 0;
    }

    ----------------------------------------------------------------------------------------------------------

    示例二:(不用线程)

    #include <iostream>
    #include <thread>
    #include <mutex>
    
    using namespace std;
    
    mutex m_lock;
    
    int sum = 0;
    
    void workFun()
    {
        
        for (int i = 0; i < 300000; i++)
        {
            sum++;
        }
        
    
    }//抢占式
    
    int main()
    {
        thread t[3];
    
        workFun();
    
        cout << "sum=" << sum << endl;
        cout << "i am main thread " << endl;
        return 0;
    }

    示例三:(使用线程,并且加锁)

    #include <iostream>
    #include <thread>
    #include <mutex>
    
    using namespace std;
    
    mutex m_lock;
    
    int sum = 0;
    
    void workFun(int index)
    {
    
        for (int i = 0; i < 100000; i++)
        {
    
            m_lock.lock();
            sum++;
            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();
        }
    
        cout << "sum=" << sum << endl;
        cout << "i am main thread " << endl;
        return 0;
    }

    示例三的耗时 会比 示例二的耗时大,所以要慎用多线程,慎用锁。设计不好的多线程反而会更耗时。

  • 相关阅读:
    nuxtjs在vue组件中使用window对象编译报错的解决方法
    如何设置网站的robots.txt
    如何进行seo优化要点总结
    Vue项目预渲染机制
    nuxt项目服务端渲染应用部署、使用pm2守护进程及遇到的问题处理
    vue-cli3整体迁移至服务端渲染nuxtjs
    NuxtJS如何利用axios异步请求
    JS实现Base64编码、解码,即window.atob,window.btoa功能
    nuxt如何处理用户登录状态持久化:nuxtServerInit 页面渲染前的store处理
    nuxtjs踩坑指南
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/14374689.html
Copyright © 2011-2022 走看看