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个线程(包括了线程号)
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(); } }};
阅读全文
0 0
- Qt多线程基础
- Qt多线程基础(QThread、QtConcurrent等)
- Qt多线程基础(一)线程同步之互斥锁同步
- Qt多线程基础(二)线程同步之信号量
- Qt多线程
- Qt多线程
- Qt多线程
- qt 多线程
- Qt多线程
- QT多线程
- QT多线程
- QT多线程
- Qt多线程
- qt 多线程
- Qt多线程
- QT 多线程
- qt 多线程
- qt多线程
- 测试博客链接
- 文章标题 HRBUST 1400 : 汽车比赛(树状数组 )
- hdu1081
- 腾讯art-template4,即vue后又获一利器
- Apache启动时报错Could not reliably determine the server's fully qualified domain name
- Qt多线程基础
- Super Sum
- redis使用列表(list)
- UVA 11987 Almost Union-Find
- 在win10下安装Tensorflow(CUDA8.0+cuDNN5.1)
- 【HDU 6092 Rikka with Subset】 思维 & 背包
- BST
- Navicat for MySQL Mac 破解版
- HDU6092 Rikka with Subset(01背包+思路)