概述
同步线程概述:
Qt中的QMutex、QReadWriteLock、QSemaphore和QWaitCondition类提供了同步线程的方法。虽然使用线程的思想是多个线程可以尽可能地并发执行,但是总有一些时刻,一些线程必须停止来等待其他线程。例如,如果两个线程尝试同时访问相同的全局变量,则结果通常是不确定的。
- QMutex
QMutex提供了一个互斥锁(mutex),在任何时间至多有一个线程可以获得mutex。如果一个线程尝试获得mutex,而此时mutex已经被锁住了,则这个线程将会睡眠,直到现在获得mutex的线程对mutex进行解锁为止。互斥锁经常用于对共享数据的访问进行保护。(例如,可以同时被多个线程访问的数据) - QReadWriteLock
QReadWriteLock即读-写锁,与QMutex很相似,只不过它将对共享数据的访问区分为“读”访问和“写”访问,允许多个线程同时对数据进行“读”访问。在可能的情况下使用QReadWriteLock代替QMutex,可以提高多线程程序的并发速度。 - QSemaphore
QSemaphore即信号量,是QMutex的一般化,它用来保护一定数量的相同的资源,而互斥锁mutex只能保护一个资源。QSemaphore有个经典的例子,即生产者消费者,后面将会以此例子进行演示同步线程的效果。 - QWaitCondition
QWaitCondition即条件变量,允许一个线程在一些条件满足时唤醒其他的线程。一个或多个线程可以被阻塞来等待一个QWaitCondition,从而设置一个用于wakeOne()或者wakeAll()的条件。使用wakeOne()可以唤醒一个随机选取的等待线程,而使用wakeAll()可以唤醒所有正在等待的线程。 - 生产者消费者示例(采取信号量)
演示代码:
//MyThread.h --- Producer and Consumer Thread
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
#include <QDebug>
#include <QThread>
//生产者线程
class Producer : public QThread
{
Q_OBJECT
public:
explicit Producer(QObject *parent = nullptr);
protected:
void run(); //重写run方法
};
//消费者线程
class Consumer : public QThread
{
Q_OBJECT
public:
explicit Consumer(QObject *parent = nullptr);
protected:
void run();
};
//MyThread.cpp
#include "producer.h"
//下面是全局变量,给生产者和消费者共同访问
const int DataSize = 10; //生产者总的生产数
const int BufferSize = 5; //缓冲区的大小
char buffer[BufferSize];
QSemaphore freeBytes(BufferSize); //空闲区域信号量
QSemaphore usedBytes; //已使用区域的信号量
Producer::Producer(QObject *parent)
: QThread{parent}
{
}
void Producer::run()
{
for(int i= 0; i<DataSize; ++i){
freeBytes.acquire(); //获取一个空闲区域的资源
buffer[i%BufferSize] = "ACGT"[(int) rand()%4]; //随机返回ACGT中的任何一个字符
qDebug() << QString("producer: %1").arg(buffer[i%BufferSize]);
usedBytes.release(); //释放一个使用区域的资源
// QThread::msleep(500);
}
}
Consumer::Consumer(QObject *parent)
: QThread{parent}
{
}
void Consumer::run()
{
for(int i = 0; i<DataSize; ++i){
usedBytes.acquire(); //获取一个使用区域的资源
qDebug() << QString("consumer: %1").arg(buffer[i%BufferSize]);
freeBytes.release(); //释放一个空闲区域的资源
}
}
//main.cpp
#include <QCoreApplication>
#include "producer.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Producer producer;
Consumer consumer;
producer.start();//开启生产者线程
consumer.start();//开启消费者线程
producer.wait();
consumer.wait();
return a.exec();
}
演示效果:
最后
以上就是正直大地为你收集整理的qt-同步线程的全部内容,希望文章能够帮你解决qt-同步线程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复