zoukankan      html  css  js  c++  java
  • QT 之 QMutexLocker如何安全锁住全局变量

    首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义   私有成员变量  和  全局变量,只能够定义局部变量来使用。

    使用方法

    (1)先定义一个QMutex类的变量

     QMutex   m_mutex;   (可以是私有成员变量,也可以是全局变量)

    (2)在定义一个QMutexLocker类的变量(注意:在需要上锁的地方直接定义即可)

    QMutexLocker locker(&mutex);

    a=5;//等等需要进行写的操作

    使用注意:  (1)如果需要对一个全局变量区域进行保护,那么QMutex定义的变量就得是全局的!

    解锁原理

    QMutexLocker上锁,解锁的原理:在该局部变量被创建的时候上锁,当所在函数运行完毕后该QMutexLocker局部变量在栈
    中销毁掉,根据他自己的机制也就相对应的解锁了。注意,如果该局部变量在中间被打断,那么QMutexLocker上的锁就不
    会被解锁掉,因为该函数没有被完整的是执行完。QMutexLocker所创建的局部变量也没有被正确销毁销毁,
    可能就和QMutexLocker他自己本身的机制不服也就不会解锁。

    例子

    操作重点在析构函数中加入让线程停止部分

    thread.h和thread.cpp

    #include <QThread>
    #include <QDebug>
    #include <QMutex>
    #include <QMutexLocker>
    #include <QWaitCondition>
     
    extern int a;
    extern QMutex m_mutex;
     
    class Thread : public QThread
    {
    public:
        Thread();
        ~Thread();
     
        void setQuit();
     
    protected:
        void run();
     
     
    private:
        bool m_quit;
    };
    #include <thread.h>
     
    int a = 6;
    QMutex m_mutex;
     
     
    Thread::Thread():
        m_quit(false)
    {
     
    }
     
     
    Thread::~Thread()
    {
        QMutexLocker m_lock(&m_mutex);
        m_quit = true;
        quit();
        wait();
    }
     
     
    void Thread::run()
    {
        while (!m_quit)
        {
            QMutexLocker m_lock(&m_mutex);
            a *= 5;
            qDebug()<<"thread1: "<<a<<endl;
            a /= 4;
            qDebug()<<"thread2: "<<a<<endl;
              
        }
    }

    data.h和data.cpp

    #include <QThread>
    #include <QDebug>
    #include <QMutex>
    #include <QMutexLocker>
     
    extern QMutex m_mutex;
    extern int a;
     
     
    class Data : public QThread
    {
    public:
        Data();
        ~Data();
     
        void setQuit();
     
    protected:
        void run();
     
    private:
     
        bool m_quit;
    };
    #include <data.h>
     
    Data::Data():
        m_quit(false)
    {
     
    }
     
     
    Data::~Data()
    {
        QMutexLocker m_lock(&m_mutex);
        m_quit = true;
        
        quit();
        wait();
    }
     
     
    void Data::run()
    {
        while (!m_quit)
        {
            QMutexLocker lock(&m_mutex);
          
            a *= 3;
            qDebug()<<"data1: "<<a<<endl;
            a /= 2;
            qDebug()<<"data2: "<<a<<endl;
        }
     
    }

    main

        Data*  data=new Data();
        Thread* thread=new Thread();
        data->start();
        thread->start();


    结果:

    data1: 18

    data2: 9

    thread1: 45

    thread2: 11

    data1: 33

    data2: 16

    thread1: 80

    thread2: 20 


    https://blog.csdn.net/zhaoyuaiweide/article/details/77991658
  • 相关阅读:
    图片反转效果
    css实现三角效果
    漂亮的阴影效果
    css名词解释
    偷学来的资料
    Git、GitHub、GitLab三者之间的联系以及区别
    分模块、分工程管理
    Spring AOP面向切面编程
    为什么要用存储过程,什么时候要用存储过程,存储过程的优点
    Spring扫描组件的使用详解
  • 原文地址:https://www.cnblogs.com/sggggr/p/12335845.html
Copyright © 2011-2022 走看看