18. Qt系统相关:多线程

一、概述

在Qt中,使用**QThread类对系统线程进行了封装。**QThread代表一个在应用程序中可独立控制的线程,也可以和进程中的其他线程共享数据。

二、QThread常用API

三、QThread使用

  1. 自定义一个类,继承自QThread,并且只有一个线程处理函数(和主线程不是同一个线程),这个线程处理函数主要就是重写父类的run函数;
  2. 线程处理函数中实现需要线程执行的逻辑;
  3. 通过类对象调用start()函数启动线程(不能直接调用run函数);
  4. 线程处理函数执行结束后,可以通过自定义信号来通知主线程;
  5. 关闭线程。

注意:

1、除了UI线程外,其他线程内不允许直接操作UI图像界面,可以通过信号槽机制通知UI线程,由UI线程进行统一处理。

2、connect()函数第五个参数表示为信号槽的连接方式,只有在多线程时才有意义。

四、线程安全

Qt中实现线程互斥和同步常用的类有:

  • 互斥锁:QMutex、QMutexLocker
  • 条件变量:QWaitCondition
  • 信号量:QSemaphore
  • 读写锁:QReadLocker、QWriteLocker、QReadWriteLock

4.1 互斥锁

4.1.1 QMutex

QMutex是Qt框架提供的互斥锁类,用于保护共享资源的访问,实现线程间的互斥操作。

4.2.2 QMutexLocker

QMutexLocker是QMutex的辅助类,使用RAII方式对互斥锁进行上锁和解锁操作。用于简化互斥锁的上锁解锁操作,避免因忘记解锁导致的死锁等问题。

{

QMutexLocker locker(&m_mutex);

// 访问共享资源

// 函数作用域结束时,locker自动解锁

}

4.2 独写锁

4.2.1 QReadWriteLock

QReadWriteLock是Qt框架提供的读写锁,用于控制独写操作的并发访问。

4.2.2 QReadLocker

QReadLocker 是RAII风格的读锁管理类,析构时自动解锁;用于读操作上锁,允许多个线程同时读取共享资源。

4.2.3 QWriteLocker

QWriteLocker 是RAII风格的写锁管理类,析构时自动解锁;用于写操作上锁,只允许一个线程写入共享资源。

4.3 条件变量

在多线程编程中,假设除了等待操作系统正在执行的线程外,某个线程还必须等待某些条件满足才能执行,这时就会出现问题。这种情况下,线程会很自然的使用锁机制在阻塞其他线程,因为这只是线程的轮流使用,并且该线程等待某些特定条件,人们会认为需要等待的线程在释放互斥锁或读写锁之后进入了睡眠状态,这样其他线程就可以继续运行。当特定条件满足时,等待条件的线程被另一个线程唤醒。

在Qt中,专门提供了QWaitCondition类来解截上述问题。

特点:QWaitCondition是Qt框架提供的条件变量类,用于线程间的消息通信和同步。

**用途:**在某个条件满足时等待或唤醒线程,用于线程间的同步和协调。

4.4 信号量

在多线程编程中,有时需要确保多个线程可以相应的访问一个数量有限的相同资源。例如,运行程序的设备可能是非常有限的内存,因此我们更希望需要大量内存的线程将这一情况考虑子啊内,并根据可用的内存数量进行相关操作,多线程编程中类似问题通常使用信号量来处理。

信号量类似于增强的互斥锁,不仅能完成上锁和解锁操作,而且可以跟踪可用资源的数量。

特点:QSemaphore是Qt框架中封装用于提供计数信号量的类,用于控制同时访问共享资源的线程数量。

**用途:**限制并发线程数量,用于解截一些资源有限的问题。

相关推荐
最爱大盘鸡35 分钟前
使用PyQt5的图形用户界面(GUI)开发教程
开发语言·qt
csdndenglu6 小时前
QT 5.9.2+VTK8.0实现等高线绘制
开发语言·qt
@Turbo@6 小时前
【QT】QString& 与QString区别
开发语言·qt
小灰灰搞电子11 小时前
Qt 仪表盘源码分享
开发语言·qt
菜鸟看点11 小时前
QT中子线程触发主线程弹窗并阻塞等待用户响应
qt
byxdaz12 小时前
Qt OpenGL 3D 编程入门
qt·opengl
誰能久伴不乏14 小时前
深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理
开发语言·qt
菜鸟看点16 小时前
QT中子线程触发主线程弹窗并阻塞等待用户响应-传统信号槽实现
qt
朱小勇本勇17 小时前
Qt自带示例及官方文档学习
开发语言·qt·学习
Wyn_18 小时前
【QT】自定义QWidget标题栏,可拖拽(拖拽时窗体变为normal大小),可最小/大化、关闭(图文详情)
开发语言·qt