1. 程式人生 > 實用技巧 >Qt之鎖

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;
}

效果:

其中這所可以找個託管的:

效果:

智慧鎖一般應用於比較短的函式:

如果寫成:

就鎖不住了。