zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt对象线程安全

2023-09-14 09:05:10 时间

GUI线程与工作线程

每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在其他另启的线程,另启的线程可以称为工作线程,主要负责处理GUI线程卸下的工作。

  尽量在对象的生存线程操作对象(如:QTimer、QTcpSocket)

  UI 对象只能在主线程操作(如:QLabel、QWidget)

​​​在一个线程中创建一个对象而在另一个线程中调用该对象的函数,不保证能行得通​​​​不按上述操作,Qt 认为是线程不安全的,在程序运行过程中极易出现程序异常崩溃​​

Qt 多线程(QThread, QtConcurrent)

  QT多线程简介

QT中线程类包含如下:

QThread 提供了跨平台的多线程解决方案

QThreadStorage 提供逐线程数据存储

QtConcurrent 支持 Lambda 表达式

QMutex 提供相互排斥的锁,或互斥量

QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁

QReadWriterLock 提供了一个可以同时读操作的锁

QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁

QSemaphore 提供了一个整型信号量,是互斥量的泛化

QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

QThread : 传统

QtConcurrent: 高级 API

其他线程访问QObject子类

QObject及其所有子类都不是线程安全的。这包含了整个事件交付系统。重要的是,切记事件循环可能正在向你的QObject子类发送事件,当你从另一个线程访问该对象时。

如果你正在调用一个QObject子类的函数,而该子类对象并不存活于当前线程中,并且该对象是可以接收事件的,那么你必须用一个mutex保护对该QObject子类的内部数据的所有访问,否则,就有可能发生崩溃和非预期的行为。

同其它对象一样,QThread对象存活于该对象被创建的线程中 – 而并非是在QThread::run()被调用时所在的线程。一般来说,在QThread子类中提供槽函数是不安全的,除非用一个mutex保护成员变量。

另一方面,可以在QThread::run()的实现中安全地发射信号,因为信号发射是线程安全的。

Qt 获取主线程地址(qApp->thread())

  qAPP: 获取QCoreApplication 实例化对象的指针

  thread(): 该 QObject 对象的生存线程

  生存线程: 创建 QObject 时的那个线程

​​​生存线程内,可以通过 moveToThread() 将该对象迁移到其他线程​​

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓