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; }
效果:
其中这所可以找个托管的:
效果:
智能锁一般应用于比较短的函数:
如果写成:
就锁不住了。
本文作者:sunshine_gzw
本文链接:https://www.cnblogs.com/SunShine-gzw/p/13278964.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步