
本文记录2018年,2019929年尝试将B站文章用作记录博客
本文记录了Qt / C ++多线程学习中不断加深的陷阱. 我想做一个个人学习的备份记录,如果不正确,请纠正我
首次发布在个人博客dksoft.site

在学习线程之前,您需要了解两个术语:
§可重入: 如果多个线程可以同时调用一个类的所有函数,并确保每个函数调用都引用一个唯一的数据,则该类被称为可重入(Reentrant表示所引用的所有函数前提是该函数的每次调用均引用唯一数据,则多个线程可以同时调用该类. )大多数C ++类都是可重入的. 同样,如果函数允许多个线程同时调用,并且每个调用只能使用其唯一数据,则该函数称为可重入函数. 全局变量不是函数唯一的数据,而是共享的. 换句话说,这意味着类或函数的用户必须使用一些其他机制(例如锁)来控制对对象实例或共享数据的序列化访问.
§线程安全: 如果多个线程可以同时调用一个类的所有函数,即使每个函数调用都引用一个共享数据,也可以说该类是线程安全的(Threadsafe表示所有即使每次调用都引用共享数据,多个线程也可以同时调用所引用类中的函数. )如果多个线程可以同时访问该函数的共享数据qt 多线程,则该函数被称为线程安全的.

§Qt :: DirectConnection: 直接连接意味着插槽功能将在发出信号的线程上直接调用
§Qt :: QueuedConnection: 队列连接意味着将事件发送到接收者所在的线程,该线程的事件循环将获取此事件,然后在以后的某个时间调用插槽函数
§Qt :: BlockingQueuedConnection: 被阻塞的队列连接就像一个队列连接,但是发送方线程将一直阻塞,直到接收方线程的事件循环获得该事件并且在该函数返回之前调用slot函数.

p>
§Qt :: AutoConnection: 自动连接(默认)表示,如果接收者的线程是当前线程,则使用直接连接;否则,将使用直接连接. 否则,将使用队列连接
使用线程易于踩到的坑:
![]()
1. 线程和线程管理器都具有依赖性,并且线程管理器(线程对象)附加到创建它的线程(创建对象). 例如,在子线程类中有一个slot函数,主线程创建一个线程管理器对象并发出信号. 连接
执行后找到插槽功能和信号. 该插槽使用队列连接,信号在主线程中发送,插槽功能也在主线程中. 即,该示例中的slot函数实际上是在主线程中执行的. 如果该插槽运行耗时的操作qt 多线程,则主线程将被阻塞.
2. 使用moveToThread更改线程依赖性. 如上例所示,slot函数实际上在main函数中运行. 这时,使用moveToThread(线程管理器);讨论线程依赖关系并将其移至子线程,然后执行耗时的操作. 它将不会阻塞主线程. 注意: 子线程类必须在run()中写入exec()才能接受信号;打开子线程,否则连接信号槽将无效.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-238422-1.html
用嘴巴说吗
你在那里填岛礁