zoukankan      html  css  js  c++  java
  • QMutexLocker基于QMutex的便利类

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

    使用方法:(1)先定义一个QMutex类的变量

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

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

                QMutexLocker locker(&mutex);

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

                

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

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

    下面的例子是在两个线程(thread和data)中分别对一个全局变量进行写操作(操作重点在析构函数中加入让线程停止部分):

    thread.h
    
    
    #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;
    };
    
    thread.cpp
    
    #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
    
    #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;
    };
    
    
    data.cpp
    
    
    #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;
    }
    
    }

    https://blog.csdn.net/zhaoyuaiweide/article/details/77991658

  • 相关阅读:
    修改注册表改变程序默认安装路径
    任务管理器在右下角的图标不显示
    WORD中插入的公式与文字对不齐——公式比文字高——文字比公式低
    tablespace
    使用Working Set让eclipse环境看着更清爽
    Grub4DOS 0.4.4 下载
    Windows和Linux操作系统下Eclipse开发C/C++程序的代码提示
    不同的编译器:GCC G++ C C++的区别
    oracle基础
    JS相关
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/11078381.html
Copyright © 2011-2022 走看看