• Qt之锁


    mythread.h:

    #ifndef MYTHREAD_H
    #define MYTHREAD_H
    
    #include <QObject>
    #include<QMutex>
    class MyThread : public QObject
    {
        Q_OBJECT
    public:
        explicit MyThread(QMutex *_q,int *_x,QObject *parent = nullptr);
    signals:
    public slots:
        void working();
    private:
        int * x;
        QMutex *q;
    };
    
    #endif // MYTHREAD_H

    mythread.cpp:

    #include "mythread.h"
    #include<QDebug>
    #include<QMutex>
    MyThread::MyThread(QMutex *_q,int* _x,QObject *parent)
        : QObject(parent),x(_x),q(_q)
    {
    
    }
    void  MyThread::working()
    {
       qDebug()<<"线程启动了"<<"object_name"<<this->objectName()<<endl;
       for(int i=0;i<500000;i++)
       {
           q->lock();
           int temp=*x;
           temp++;
           *x=temp;
          q->unlock();
       }
        qDebug()<<"线程结束了"<< "x="<<*x<<"object_name"<<this->objectName()<<endl;
    }

    widget.h:

    #ifndef WIDGET_H
    #define WIDGET_H
    #include <QWidget>
    #include"mythread.h"
    #include<QThread>
    class Widget : public QWidget
    {
        Q_OBJECT
    public:
        Widget(QMutex *mutex=0,int _value=0,QWidget *parent = 0);
        ~Widget();
    private:
        int value;
        MyThread *t1;
        MyThread *t2;
        QThread *w1;
        QThread *w2;
        QMutex *mutex;
    };
    
    #endif // WIDGET_H

    widget.cpp:

    #include "widget.h"
    #include "mythread.h"
    Widget::Widget(QMutex *mutex,int _value,QWidget *parent)
        : QWidget(parent),value(_value)
    {
        mutex=new QMutex;
        t1=new MyThread(mutex,&value);
        t2=new MyThread(mutex,&value);
        w1=new QThread(this);
        w2=new QThread(this);
        t1->setObjectName("t1");
        t2->setObjectName("t2");
        t1->moveToThread(w1);
        t2->moveToThread(w2);
    
        connect(w1,SIGNAL(started()),t1,SLOT(working()));
        connect(w2,SIGNAL(started()),t2,SLOT(working()));
        connect(w1,SIGNAL(finished()),t1,SLOT(deleteLater()));
        connect(w2,SIGNAL(finished()),t2,SLOT(deleteLater()));
        w1->start();
        w2->start();
    }
    
    Widget::~Widget()
    {
       w1->quit();
       w1->wait();
       w2->quit();
       w2->wait();
       delete  mutex;
    }

    效果:

    其中这所可以找个托管的:

     效果:

    智能锁一般应用于比较短的函数:

    如果写成:

    就锁不住了。

  • 相关阅读:
    JS高级知识部分【4】
    关于python3 使用pycharm+unittest+html+HTMLTestRunner 测试用例运行正常,但却不能生成测试报告的解决方法
    python生成HTMl报告(unittest)
    Linux系统下安装jenkins使用
    jenkins使用
    UI定位元素大全(跟App定位元素差不多哦)
    UI自动化前置代码
    python+selenium+pytest+html报告
    jenkins解决python不是内部命令
    如何做好APP功能测试?
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13278964.html
Copyright © 2020-2023  润新知