Qt多线程基础

来源:互联网 发布:nginx module 编辑:程序博客网 时间:2024/06/05 09:28

1、线程与进程

  • 一个进程(process)至少有一个线程(thread);
  • 启动一个进程需要分配独立的地址空间,创建相应的数据表来维护它的代码段、堆栈段以及数据段;而多个线程可以共用一个地址空间,共享大部分的数据;
  • 由于多线程中有共享的数据,因此其通信比进程方便。

2、多线程优势

  • 提高应用程序的响应速度,对于开发图形界面程序尤为重要;
  • 使多CPU系统更加有效;
  • 改善程序结构

3、Qt中的多线程(主要介绍Qt中多线程的创建,线程同步的一些类)
3.1 多线程创建

  • 两步:继承Qthread实现run()函数
#include <QObject>#include <QThread>//1、继承QThreadclass WorkThread : public QThread{    Q_OBJECTpublic:    WorkThread(){};protected:    //2、实现虚函数run    void run(){//打印一些数字    while(true){               int n = 0;        for(n;n < 10; n++){            qDebug() << n << n << n << QThread::currentThread();            //使用qDebug而没使用printf的原因:            //printf具有一个I/O锁,多个线程调用时将出现阻塞        }    }};};
  • 在采用不同的线程数,打印的结果如下图所示:第一个为1个线程,第二个为5个线程(包括了线程号)
    图1,采用一个线程

    图2,采用5个线程

3.2 线程同步
线程同步的类包括了:Qmutex、QReadWriteLock、Qsemaphore

  • Qmutex类提供了一种保护变量或者一段代码的方法,其lock()方法来锁着互斥量(mutex),如果互斥量处于解锁状态(unlock),线程就立即占用并锁定(lock);否则阻塞。
  • QReadWriteLock类,在程序有一个或多个线程访问和修改共享数据时采用,如下
    这里写图片描述
  • QSemaphore类(信号量),为互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,可以用来保存一定数量的同种资源。其典型用例是控制生产者/消费者之间共享的环形缓冲区。

    • 生产者/消费者控制:
      • 1、生产者不能过快的生产数据,以免覆盖消费者还没有使用过的数据
      • 2、消费者不能过快的使用数据,以免使用未产生的数据
    • 方案:
      • 1、让生产者填充完缓冲区后,让消费者读取。
      • 2、使用生产者和消费者同时操作缓冲区的不同部分。

    如下图所示为整个过程:
    初始化

开始

const int DataSize = 1000;//所有数据const int bufferSize = 10;int buffer[bufferSize];//缓冲区QSemaphore freeByte(bufferSize);//初始化生产者客使用的空间大小QSemaphore useByte(0);class Producer:public QThread{public:    Producer(){}    void run(){        for(int i = 0; i < DataSize; i++){            freeByte.acquire();//获取可用空间,n=1            buffer[i%bufferSize] = i%bufferSize;            useByte.release();//释放空间        }    }};class Consumer:public QThread{public:    Consumer(){}    void run(){        for(int i = 0; i < DataSize; i++){            useByte.acquire();            qDebug() << buffer[i%bufferSize];            freeByte.release();        }    }};
原创粉丝点击