当前位置:网站首页>QT(41)-多线程-QTThread-同步QSemaphore-互斥QMutex
QT(41)-多线程-QTThread-同步QSemaphore-互斥QMutex
2022-08-04 20:03:00 【多云的夏天】
1.QTThread
2.QSemaphore
3.QMutex
1.QTThread


1.1QThread h 头文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#1.继承于public QThread
//2.虚函数run()
class MyThread:public QThread
{
Q_OBJECT
public:
explicit MyThread(QObkect *parent=0);
protected:
virtual void run();
signals:
public slots:
};
#endif1.2.QThread cpp文件
#include"MyThread.h"
#include<QDebug>
MyThread::MyThread(QObject *parent):QThtrad(parent)
{
}
void MyThread::run()
{
int i=1;
for(i=1;i<=5;i++)
{
qDebug()<<i;
sleep(1);
}
}
1.3 main 调用文件
#include<QApplication>
#include"MainWindow.h"
#include"MyThread.h"
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
MyThread mt;
mt.start();
MainWindow mw;
mw.show();
return a.exec();
} 2.同步QSemaphore

线程的执行顺序是由信号量的个数指定的。

两个线程类
ThreadNum tn; //打印1 2 3
ThreadAlphabet ta; //打印 abc
先打印 abc 再打印 1 2 3
#include<QApplication>
#include"ThreadNum.h"
#include"ThreadAlphabet.h"
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ThreadNum tn;
ThreadAlphabet ta;
tn.start();
ta.start();
return a;
}//semManager 单例的模式
#include <QSemaphore>
class SemManager
{
//1.创建两个变量
QSemaphore semnum; // 对应于ThreadNum
QSemaphore semAlphabet;// 对应于ThreadAlphabet
//2.私有化单例
public:
static SemManager *getInstance();
private:
static SemManager *instance;
SemManager();
};
#endif
semManager.cpp
#include "SemManager.h"
SemManager *SemManager::instance=0;
SemManager *SemManager::getInstance()
{
if(0==instance)
instance=new SemManager;
return instance;
}
SemManager::SemManager():semnum(0),semAlphabet(1)
{
}
.acquire() -1 release() +1
2.1ThreadAlphabet 调用
#include"ThreadAlphabet.h"
#include<QDebug>
#include"SemManager.h"
ThreadAlphabet::ThreadAlphabet(QObject *parent):QThtread(parent)
{
}
void ThreadAlphabet::run()
{
int i=0;
SemManager *sm= SemManager ::getInstance();
for(i=0;i<=3;i++) //初始值为0
{
sm->semAlphabet.acquire(); //semAlphabet -1
qDebug()<<(char)('a'+i);
sleep(2);
sm->semNum.release(); //semNum +1
}
}2.2ThreadNum调用
#include"ThreadNum.h"
#include<QDebug>
#include"SemManager.h"
ThreadNum::ThreadNum(QObject *parent):QThtread(parent)
{
}
void ThreadNum::run()
{
int i=0;
SemManager *sm= SemManager ::getInstance();
for(i=1;i<=3;i++) //初始值为1
{
sm->semNum.acquire(); //semNum -1
qDebug()<<i;
sleep(1);
sm->semAlphabet.release(); //semAlphabet +1
}
}3.QMutex

Ticket.h
#include <QThread>
#include <QMutex> //1.添加头文件
class Ticket
{
private:
int ticketCount;
QMutex mutex; //2.添加变量
public:
Ticket(int count=1);
void takeTicket();
};
class TicketThread:public QThread //线程函数 对数量进行减操作
{
Q_OBJECT
public:
explicit TicketThread(QObject *parent=0);
protected:
virtual void run();
}
Ticket.cpp
#include"TicketThread.h"
#include<QDebug>
Ticket ticket(1);
//1.Ticket
Ticket::Ticket(int count):ticketCount(count)
{
}
void Ticket::takeTicket()
{
mutex.lock(); //1.函数上锁
if(ticketCount >0)
{
ticketCount--;
qDebug()<<"take success,last:"<<ticketCount;
}
else
{
qDebug()<<"take failed";
}
mutex.unlock(); //2.函数解锁
}
//2.TicketThread
TicketThread::TicketThread(QObject *parent):QThread(parent)
{
}
void TicketThread::run()
{
ticket.takeTicket();
}main.cpp
#include <QApplication>
#include "mainwindow.h"
#include "TicketThread.h"
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
TicketThread tt1;
TicketThread tt2;
TicketThread tt3;
TicketThread tt4;
tt1.start();
tt2.start();
tt3.start();
tt4.start();
return a.exec();
} 应该不会出现负数,但是实际上出现了。多线程时会让判断实效的。
边栏推荐
猜你喜欢

实现菜单拖拽排序

使用 Allatori 进行 Jar 包混淆

JS手写JSON.stringify() (面试)

Use "green computing" technology to promote sustainable development of computing power

电脑一键重装系统后连不上远程了?教你设置的方法

运维就业现状怎么样?技能要求高吗?

刷题-洛谷-P1307 数字反转

Chrome安装zotero connector 插件

ASP.NET商贸进销存管理系统源码(带数据库文档)源码免费分享

"WAIC 2022 · hackers marathon" two ants wealth competition invited you to fight!
随机推荐
awk statistical difference record
"WAIC 2022 · hackers marathon" two ants wealth competition invited you to fight!
win10终端中如何切换磁盘
【Attention 演变史】RNN的产生、架构、推广、问题(第一弹)
Differences in the working mechanism between SAP E-commerce Cloud Accelerator and Spartacus UI
刷题-洛谷-P1304 哥德巴赫猜想
AWS SES 的监控和告警
基于Nodejs的电商管理平台的设计和实现
Tensorflow2 环境搭建
数据安全解决方案的发展
Order of lds links
刷题-洛谷-P1179 数字统计
面试官:JVM运行时数据区包含哪几部分?作用是啥?
EasyUi常用代码
How to monitor code cyclomatic complexity by refactoring indicators
C语言基础[通俗易懂]
微信小程序云开发 | 赠、删、改城市名称信息的应用实现
零知识证明——zkSNARK证明体系
华为企业组网实例:VRRP+MSTP典型组网配置
win10 uwp 修改图片质量压缩图片