首页 > 其他分享 >子线程和中断的比较

子线程和中断的比较

时间:2023-12-24 14:31:42浏览次数:34  
标签:状态 中断 可以 主线 线程 比较 运行

子线程是在主线程之外创建的线程。与主线程相比,子线程通常用于执行耗时的任务,以避免阻塞主线程的运行。子线程可以同时运行多个,并且可以进行多任务处理。


子线程的运行状态包括:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。子线程的启动可以通过start()方法来实现,并且可以通过调用join()方法等待子线程的完成。 子线程与主线程之间可以通过共享内存或消息传递的方式进行通信。共享内存可以使用共享的变量进行数据交换,但需要注意线程安全性,线程间通讯在Qt中绝大部分都是采用信号与槽机制来实现,减少系统的耦合度。消息传递可以通过队列等方式实现,不同线程之间通过发送和接收消息来实现通信。

优点:子线程的使用可以提高程序的并发性,充分利用多核处理器的性能。

缺点:但需要注意子线程的创建和销毁等开销,以及正确处理共享数据和线程同步的问题,以避免出现线程安全性问题。

Qt应用:

步骤【1】头文件声明①或者直接在源文件中声明②:

子线程和中断的比较_子线程

子线程和中断的比较_主线程_02

步骤【2】源文件 新建线程和工作对象:

子线程和中断的比较_线程安全_03

以下是主线程和子线程的示意图。

子线程和中断的比较_子线程_04





中断是指在一个线程执行过程中,通过发送一个中断信号来请求线程停止正在执行的任务,从而提高程序的可控性和响应性。线程在收到中断信号后可以根据具体情况选择如何处理中断,比如立即停止任务、继续执行、或者在合适的时机进行退出,这与中断的优先级设置有关。

当一个线程被中断时,如果线程处于等待或睡眠状态,那么它会立即结束等待或睡眠,并且抛出InterruptedException异常。如果线程处于运行状态,那么它可以根据具体情况自行选择如何处理中断,例如停止任务、继续执行,或者在合适的时机完成后退出。 在处理中断时,应该注意线程安全性和数据一致性可以使用标志位或volatile变量来实现线程间的通信,以便于检查中断状态。同时,可以使用synchronized关键字或Lock对象来保证数据一致性,并避免出现竞态条件等问题。

优点:中断机制是一种优雅且灵活的线程控制方式,能够实现线程的可控性和响应性。在编写多线程程序时,应充分考虑中断的使用,以便提高程序的健壮性和可维护性。

缺点:中断过多且设置混乱,会导致程序崩溃。可能导致资源泄漏,当某线程在等待某个资源时被中断,如果没有正确处理中断,可能会导致该资源一直被占用,从而引发资源泄漏的问题。可能引起死锁:在多线程编程中,如果线程在等待某个锁的时候被中断,而没有正确处理中断,可能会导致产生死锁的情况。可能导致性能下降:中断操作本身会带来一定的开销,如果频繁地使用中断,可能会降低程序的性能。因此,在设计使用中断的线程时,需要权衡中断的使用频率和性能之间的平衡。可能引发安全问题:如果线程在处理中断时,没有正确处理共享数据和线程同步,可能会导致出现线程安全性问题,如竞态条件、数据不一致等。按照中断设置规则办事,弄清楚中断的运行规则,是正确高效使用中断的前提。

C/C++应用:中断初始化(触发方式、抢占优先级、响应优先级、中断线配置、有的需要IO口配置等等)+编写中断服务函数(管理好中断标志)

下面是以按键触发中断来示意中断运行的过程。

子线程和中断的比较_主线程_05


中断与子线程

 相同

  • 多线程编程相关的概念,用于提高程序的并发性和响应性。


不同:

  • 定义不同:中断是一种线程控制机制,用于请求线程停止正在执行的任务;子线程是指在主线程之外创建的线程,用于执行耗时的任务,以避免阻塞主线程的运行。
  • 使用不同:中断通过调用Thread类的interrupt()方法来发出中断信号;子线程可以通过继承Thread类或实现Runnable接口来创建,并通过调用start()方法来启动。(这里是以Qt中为例的)
  • 处理不同:线程收到中断信号后可以根据具体情况选择如何处理中断,可以立即停止任务、继续执行,或者在合适的时机退出;子线程的运行状态有新建、就绪、运行、阻塞和死亡状态,可以通过调用join()方法等待子线程的完成。
  • 目标不同:中断是针对具体线程的,可以对特定线程发出中断信号;子线程是主线程的一个执行单位,创建的子线程可以并发执行多个任务。


标签:状态,中断,可以,主线,线程,比较,运行
From: https://blog.51cto.com/u_16251306/8955811

相关文章

  • Java多线程​(三)线程安全:同步及锁
    线程安全问题考虑如下情景:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票。publicclassTicketSellerextendsThread{//定义票的数量staticintticket=0;//取值范围:0~99@Overridepublicvoidrun(){while(true){......
  • FreeRTOS中的中断中能否使用互斥量
    在嵌入式系统中,实时操作系统(RTOS)是为了确保任务的实时性和协同工作而设计的。FreeRTOS作为一款流行的RTOS,提供了丰富的同步和通信机制,其中互斥量是一种用于保护共享资源的关键工具。然而,开发者在使用FreeRTOS时,经常会面临一个问题,即在中断中是否可以安全地使用互斥量。本文将深入讨......
  • xv6 磁盘中断流程和启动时调度流程
    本文讲述xv6中的一些细节流程,还有对之前文中遗留的问题做一些补充说明,主要有以下几个问题:一次完整的磁盘中断流程进入调度器后的详细流程sched函数中的条件判断scheduler函数中为什么要周期性关中断一次完整的磁盘流程此节讲述完整的磁盘读写流程,读写的流程总体差不多,这里以读......
  • 51 单片机【外部中断、定时器中断、回调函数】
    51单片机【外部中断、定时器中断、回调函数】​ 这里的外部中断类似监听器,时时刻刻监视某引脚的电平变化;这里的定时器中断类似于定时任务,可以定时执行某函数;这里将回调函数和中断结合起来,案例里有点设计模式的味道(忘了哪个了,也可能就是感觉,关于高层不能调用低层的解决),也有点函数......
  • 短视频直播系统,前端比较常见的几种动画实现方式
    短视频直播系统,前端比较常见的几种动画实现方式我整理了如下的6种方式,接下来我们以最简单的例子,一个div从左到右移动一定的距离,分别看看这几种方案的具体实现。如有不妥还望指正。 一、CCSanimation这里省略了html部分,我们直接看css:.box{height:100px;......
  • JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回
    通过gceasy工具对生成的GC日志进行分析这里使用的JDK版本为JDK8!在分析GC日志时,可以同时采用多种工具(Arthas、gceasy、JVM连接Graphana监控)进行分析,避免某种工具分析不准确gceasy每个月只可以免费分析5个gc日志,因此要节约机会!hhh!我们先将gc.log文件放入gceasy......
  • Trace 在多线程异步体系下传递
    在多线程异步体系下传递异步编程基础什么是异步编程异步编程基础异步编程是一种编程模式,用于处理多线程异步体系下的任务传递和执行。通常情况下,传统的同步编程,任务按照顺序依次执行,直到完成才能进行下一个任务。在多线程异步体系下,任务可以并行执行,无需按照顺序等待前一个任务完成......
  • ThreadLocal和InheritableThreadLocal详解,基本原理及注意项 父子线程数据共享
    一、ThreadLocal介绍在多线程环境下访问同一个线程的时候会出现并发问题,特别是多个线程同时对一个变量进行写入操作时,为了保证线程的安全,通常会进行加锁来保证线程的安全,但是加锁又会造成效率的降低;ThreadLocal是jdk提供的除了加锁之外保证线程安全的方法,其实现原理是在Thread类......
  • Spring连接线程的事务控制
    Spring连接线程的事务控制通过把线程ThreadLocal绑定数据库来连接Connection来控制事务源码实现的方式不够优雅代码实现pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org......
  • 聊一聊 C# 线程切换后上下文都去了哪里
    一:背景1.讲故事总会有一些朋友是不是问一个问题,在Windows中线程做了上下文切换,请问被切的线程他的寄存器上下文都去了哪里?能不能给我挖出来?这个问题其实比较底层,如果对操作系统没有个体系层面的理解以及做过源码分析,其实很难说明白,这篇我们就从.NET高级调试的角度试着分析一......