qt 多线程

比较旧的方法是 通过继承,重写run方法
设置线程优先级, start() ,后会调 run run结束后,thead会结束执行,但需要手动销毁。 其他有用的方法 wait(), quit(), exit() deletelater(); exec() ;
如果没有exec(), 则不能接收信号槽 ,exec()是默认的run实现执行的, 如果重写了run, 也要写一下exec()

也可以使用qthread::create,传入方法,参数, 去运行

也可以通用信号槽,把对像Move到线程上, 使用线程默认的exec(),来执行对像的方法,这种方式也不需要继承,重载
通常会用到这几个信号
started -> 执行对象成员方法
对象方法结束信号 -> quit
finished -> 删除对象
当然这种方式不是很面向对象,所以更进一步,封闭对象,把qthread对使用者藏匿起来也是可以的

qthread只有run方法是在其他线程的, 它本身属于构建他的线程

在异步线程中, 不可以调用主线程的控件, widget, qml ,或pixelmap 相关的api
但是可以处理qimage painter , opengl, 处理opengl时,需要检测一下,是否支持多线程 qopenglcontext:;supportstheadedopengl()

多线程中为了防止数据竞争,需要用到锁
qmutux 递归 性能不好 非递归 非递归性能好点,但要确保不要在同一个线程多次访问同一个上锁的方法
qsemaphore 信号量,
qwaitcondition
qreadwritelock 支持同时读,但不支持写的时候在读或在写
qatomicint 安全并发的加整数
qatomicPointer 安全并发的加指针
qspinlock 自旋

raii用的类
qmutexlocker,qreadloader 等

qthread中也有 requestInterruption, 和isInterruptionRequested ,用来做一个多纯正程安全的退出请求,类似c#中的task cancel token


概念
线程安全方法, 多线程同一时间,在同一数据上执行, 不需要同步

可重入方法:多线程同一时间,不同数据上执行, 否则需要额外同步

不可重入方法: 又称非线程安全 ,不可以在不同线程访问

对于类,上面的说法适用于非静态成员函数 (把this当成参数来看待

posted @   马肯尼煤牙巴骨  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示