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

效果:

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

效果:

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

如果写成:

就锁不住了。

最新文章

  1. gitlab使用个人版v16.11
  2. JavaScript css-dom
  3. membership db注册工具
  4. Java 中使用 UEditor 整理【待续。。。】
  5. C语言运算符优先级表
  6. 针对目前高校移动App的火热,哥决定点一把火
  7. 说说CSS学习中的瓶颈
  8. B - Maya Calendar(第二季水)
  9. C# 继承细节
  10. hdu(2062)-Subset sequence 组合数学
  11. 关于wxpython多线程研究包括(import Publisher错误研究)
  12. Windows 下使用 工具修改文件的 时间
  13. Day03(黑客成长日记)------&gt;元祖及列表的增减改查
  14. 从一次线上故障思考Java问题定位思路
  15. Spark简介安装和简单例子
  16. Vue系列之 =&gt; 组件切换
  17. MVC的Forms登录验证
  18. C#学习笔记(2)——操作sqlite数据库增删改查
  19. codeforces水题100道 第二十五题 Codeforces Round #197 A. Helpful Maths (Div. 2) (strings)
  20. dbt macro 说明

热门文章

  1. 为dokcer中最简版ubuntu(70M)增加apt安装能力
  2. nim_duilib(5)之option
  3. window11连接局域网共享失败处理办法
  4. HDU 5965:扫雷(DP,递推)
  5. STC8A,STC8G,STC8H系列的IRC内部振荡源频率调节
  6. Log4j 2.17.0 再曝漏洞,但不要惊慌!
  7. WebRTC源码开发(一)MacOS下源码下载、编译及Demo运行
  8. 求区间内第一个大于等于x的数的下标
  9. Windows下安装配置ant
  10. centos7 查看卸载软件