当前位置:网站首页>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();
} 应该不会出现负数,但是实际上出现了。多线程时会让判断实效的。
边栏推荐
- Desthiobiotin衍生物Desthiobiotin-PEG4-Amine/Alkyne/Azide/DBCO
- 简单理解 JS 事件循环
- really time ntp service start command
- C#将对象转换为Dictionary字典集合
- The establishment of simple data cache layer
- 数据安全解决方案的发展
- 电脑一键重装系统后连不上远程了?教你设置的方法
- 程序员如何在职场上少走弯路?
- The book "The Essence of Alipay Experience Design", a record of knowledge related to testing
- hash和history路由的区别
猜你喜欢
随机推荐
格密码入门
win10 uwp 使用 ScaleTransform 放大某个元素
长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用
Qt Designer生成的图形可以自适应窗口的大小变化
【Attention演变史】翻译模型seq2seq (第二弹)
uwp ScrollViewer content out of panel when set the long width
String中的hashcode缓存以及HashMap中String作key的好处
The book "The Essence of Alipay Experience Design", a record of knowledge related to testing
2022年国内手机满意度榜单:华为稳坐国产品牌第一
awk 统计差值记录
Differences in the working mechanism between SAP E-commerce Cloud Accelerator and Spartacus UI
Red5搭建直播平台
zynq 记录
JSD-2204-酷莎商城(管理员模块)-密码加密-Day10
带你了解数据分布式存储原理
力扣题(5)—— 最长回文子串
Embrace the Cmake child is simple and practical, but inflexible
v-model的使用
密码学系列之:PEM和PKCS7,PKCS8,PKCS12
awk statistical difference record









