热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解线程、进程、多线程、线程池

本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神!为什么要使用多线程、线程锁、互斥量、信号量?为什么需要线程

本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神 !

为什么要使用多线程、线程锁、互斥量、信号量? 为什么需要线程同步? 什么是线程池? 本文一文详解多线程。

本文作者原创,转载请附上文章出处与本文链接。

目录

1. 线程进程的区别

1.1 进程 :

1.2 线程:

1.3 线程的三种实现:

1.4 总结:

看懂没?嗯哼?

2. 线程锁、互斥量、信号量、线程同步

2.1 线程锁

2.2 互斥量QMutex

先看完本篇文章在进一步了解不迟,那么使用QMutex锁会有什么问题呢?

2.3 信号量QSemaphore

信号量最大的作用就是可以在多线程同时访问同一资源的时候使其顺序访问 !具体了解请点击连接文章有详尽的示例、实现、以及遇到的问题和作者总结的经验 !

看在我的这几个黑眼圈的份上希望大家点点关注、点点赞、点点收藏支持一下 \抱拳

3. 线程池和多线程的区别

4. 线程池是什么?线程池的具体使用 !

5. 多线程的各种操作


1. 线程进程的区别

线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。

上面话还是比较官方的,那么下来我给大家用大白话解释一下,方便大家面试的时候吊打面试官!

1.1 进程 :

  • 进程就是一个应用一个程序
  • 进程在计算机内存当中有单独的内存的应用。
  • 进程里面可以有单个线程或者多个线程(单线程应用、多线程应用)。

1.2 线程:

  • 进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。
  • 线程必须存在(依赖进程)应用里面,它无法单独存在。
  • 线程在计算机当中没有单独的内存,它只能在进程的内存中存在。
  • 线程一般是单线程,使用多线程必须得在进程里面设置(写多线程代码)。

1.3 线程的三种实现:

  • 继承 QThread,重写 run() 接口;
  • 使用 moveToThread() 方法将 QObject 子类移至线程中,内部的所有使用信号槽的槽函数均在线程中执行;
  • 使用 QtConcurrent
  • 其实还有一种就是使用线程池QThreadPool也算一种方式
  • 一般使用 QThread 重写run来实现多线程  或者 使用信号和槽的方式来实现多线程就够用了

1.4 总结:

  • 线程和进程是依赖关系
  • 线程依赖于进程(应用)
  • 进程就是应用
  • 线程就是应用(进程)的实际执行者

    PS:进程可以看成是脑子,线程可以看作是手脚嘴口鼻子耳朵,没有脑子就没有手脚口足,没有手脚口足只有脑子也没用。

看懂没?嗯哼?

2. 线程锁、互斥量、信号量、线程同步

2.1 线程锁

要保证某个资源在多线程的情况下的安全、可靠、顺序访问,可以使用线程锁,线程锁有两种一种是互斥量、一种是信号量

接下来详解两种方法的优缺点和各自的特点。以QT程序为例(其它大同小异,原理相同)。

2.2 互斥量QMutex

QMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。

  • 这句话话怎么理解呢?

    • QMutex主要的作用是保护第一次访问到资源线程的安全

    • 那么是什么情况下使用呢?

    • 主要用来初始化、第一次读取资源、保证第一次初始化资源的安全、准确、不被其它线程干扰。

    • 因为第一次初始化的资源变量参数已经被保存了,第二次和之后无论几次 就算改变这个变量参数,第一次保存的值是不受干扰的。

如果想进一步了解请参考博主的另一篇转载的线程锁文章: QT QMutex使用详解  QT QMutex使用详解_双子座断点的博客-CSDN博客_qt qmutex

先看完本篇文章在进一步了解不迟,那么使用QMutex锁会有什么问题呢?

QMutex的作用只对   多线程中的第一次访问到资源的线程起作用 ! QMutex并不会对并发中的第二个线程第三个线程起作用,触发QMutex并不会阻塞后面的线程。

那么想要达到既要对线程起阻塞作用、又要保护资源在多线程中的顺序访问怎么办呢?那请看接下来的 信号量QSemaphore

2.3 信号量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用法

信号量最大的作用就是可以在多线程同时访问同一资源的时候使其顺序访问 !具体了解请点击连接文章有详尽的示例、实现、以及遇到的问题和作者总结的经验 !

看在我的这几个黑眼圈的份上希望大家点点关注、点点赞、点点收藏支持一下 \抱拳

3. 线程池和多线程的区别
  • 线程池是在程序运行开始,创建好的n个线程,并且这n个线程挂起等待任务的到来。
  • 而多线程是在任务到来得时候进行创建,然后执行任务。
  • 线程池中的线程执行完之后不会回收线程,会继续将线程放在等待队列中;
  • 多线程程序在每次任务完成之后会回收该线程。
  • 由于线程池中线程是创建好的,所以在效率上相对于多线程会高很多。
  • 线程池也在高并发的情况下有着较好的性能;不容易挂掉。
  • 多线程在创建线程数较多的情况下,很容易挂掉。

3.1 多线程和线程池流程图

4. 线程池是什么?线程池的具体使用 !
  • 线程池:
    • 创建和销毁线程需要和OS交互,少量线程影响不大,但是线程数量太大,势必会影响性能,使用线程池可以这种开销;
    • 线程池维护一定数量的线程,使用时,将指定函数传递给线程池,线程池会在线程中执行任务;
  • 具体使用
    • 作者个人观点:
    • 一般中小型项目还是直接使用多线程好一点各个环节都自定义比较好点,多线程交互,统一创建销毁等。
    • 大型项目使用线程池比多线程好点,线程池用起来比较方便有统一的管理、挂起唤醒都有封装用的时候只需要唤醒一个线程就好。
    • 感觉这个还是看个人习惯和规定。

如果想进一步了解请参考博主的另一篇原创文章:QT 多线程之线程池QThreadPool(深入理解) CSDN

5. 多线程的各种操作

以下文章均为作者原创文章,看完记得收藏、关注加?

线程、进程、多线程、线程池一文看懂从此秒变大佬!:深入理解线程、进程、多线程、线程池_双子座断点的博客-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


推荐阅读
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
author-avatar
童T-Aurora
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有