本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神 !
为什么要使用多线程、线程锁、互斥量、信号量? 为什么需要线程同步? 什么是线程池? 本文一文详解多线程。
本文作者原创,转载请附上文章出处与本文链接。
目录
1. 线程进程的区别
1.1 进程 :
1.2 线程:
1.3 线程的三种实现:
1.4 总结:
看懂没?嗯哼?
2. 线程锁、互斥量、信号量、线程同步
2.1 线程锁
2.2 互斥量QMutex
先看完本篇文章在进一步了解不迟,那么使用QMutex锁会有什么问题呢?
2.3 信号量QSemaphore
信号量最大的作用就是可以在多线程同时访问同一资源的时候使其顺序访问 !具体了解请点击连接文章有详尽的示例、实现、以及遇到的问题和作者总结的经验 !
看在我的这几个黑眼圈的份上希望大家点点关注、点点赞、点点收藏支持一下 \抱拳
3. 线程池和多线程的区别
4. 线程池是什么?线程池的具体使用 !
5. 多线程的各种操作
线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。
PS:进程可以看成是脑子,线程可以看作是手脚嘴口鼻子耳朵,没有脑子就没有手脚口足,没有手脚口足只有脑子也没用。
看懂没?嗯哼?
要保证某个资源在多线程的情况下的安全、可靠、顺序访问,可以使用线程锁,线程锁有两种一种是互斥量、一种是信号量。
接下来详解两种方法的优缺点和各自的特点。以QT程序为例(其它大同小异,原理相同)。
QMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。
这句话话怎么理解呢?
QMutex主要的作用是保护第一次访问到资源线程的安全
那么是什么情况下使用呢?
主要用来初始化、第一次读取资源、保证第一次初始化资源的安全、准确、不被其它线程干扰。
因为第一次初始化的资源变量参数已经被保存了,第二次和之后无论几次 就算改变这个变量参数,第一次保存的值是不受干扰的。
如果想进一步了解请参考博主的另一篇转载的线程锁文章: QT QMutex使用详解 QT QMutex使用详解_双子座断点的博客-CSDN博客_qt qmutex
QMutex的作用只对 多线程中的第一次访问到资源的线程起作用 ! QMutex并不会对并发中的第二个线程第三个线程起作用,触发QMutex并不会阻塞后面的线程。
那么想要达到既要对线程起阻塞作用、又要保护资源在多线程中的顺序访问怎么办呢?那请看接下来的 信号量QSemaphore
QSemaphore也可以被用来使线程的执行顺序化,和QMutex的方法相似。信号量和互斥量的不同在于,信号量可以在同一时间被多于一个的线程访问。
这句话话怎么理解呢?
在多线程并发的情况下 (多个线程同时访问一块地方) 就会导致顺序错乱,与理想情况不一致。
创建三个线程打印A、B、C 打印五遍
情况 ABC ABC ABC ABC ABC
实际情况 ACB AAB CCA CCB ACB 、AAAAA BBBBB CCCCC 等等情况
怎么解决呢?当然是使用信号量QSemaphore !
使用信号量QSemaphore,这里最主要的就是"信号量"这三个字 !
如果想进一步了解请参考博主的另一篇原创文章:QT 线程之QSemaphore(深入理解) QT 线程之QSemaphore(深入理解)_双子座断点的博客-CSDN博客_qsemaphore用法
如果想进一步了解请参考博主的另一篇原创文章:QT 多线程之线程池QThreadPool(深入理解) CSDN
以下文章均为作者原创文章,看完记得收藏、关注加
线程、进程、多线程、线程池一文看懂从此秒变大佬!:深入理解线程、进程、多线程、线程池_双子座断点的博客-CSDN博客
QT 初识线程(简单实现):https://blog.csdn.net/qq_37529913/article/details/110127940
QT QMutex使用详解:https://blog.csdn.net/qq_37529913/article/details/110187452
QT 线程之QSemaphore(深入理解):https://blog.csdn.net/qq_37529913/article/details/110187121
QT线程 Emit、Sgnals、Slot详细解释:https://blog.csdn.net/qq_37529913/article/details/110211435
QT 线程之QWaitCondition(深入理解):https://blog.csdn.net/qq_37529913/article/details/110212704
Qt 多线程之线程事件循环(深入理解):https://blog.csdn.net/qq_37529913/article/details/110229382
QT线程之QObjects(深入理解):https://blog.csdn.net/qq_37529913/article/details/110228837
QT线程之可重入与线程安全(深入理解):https://blog.csdn.net/qq_37529913/article/details/110224166
QT 主线程子线程互相传值:QT 主线程子线程互相传值_双子座断点的博客-CSDN博客_qt主线程给子线程传数据
QT线程同步与异步处理:QT线程同步与异步处理_双子座断点的博客-CSDN博客_qt异步线程
QT 多线程之线程池QThreadPool(深入理解):QT 多线程之线程池QThreadPool(深入理解)_双子座断点的博客-CSDN博客_qthreadpool
QT之浅拷贝、深拷贝、隐式共享(深度理解必看文章):https://blog.csdn.net/qq_37529913/article/details/110235596
QT 隐式共享机制对STL样式迭代器的影响:https://blog.csdn.net/qq_37529913/article/details/110252454