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; }
效果:
其中这所可以找个托管的:
效果:
智能锁一般应用于比较短的函数:
如果写成:
就锁不住了。